Commit Diff


commit - 6678ad177ad1fe96b0e65b8b7ab79839a5548938
commit + b6c2287f5b3ca967208eed57480d56a7a852ba57
blob - 04346d23d3002f0a477019d4b8a83bba02869deb
blob + e18fd28ce14d3a2be37d715ceb339c75cac22e24
--- build.xml
+++ build.xml
@@ -15,8 +15,12 @@
     <pathelement location="${jar}/org.apache.crimson.jar"/>
     <pathelement location="${jar}/org.mortbay.jetty.jar"/>
     <pathelement location="${jar}/mckoidb.jar"/>
-    <pathelement location="${jar}/xmlrpc-1.2-b1.jar"/>
+    <pathelement location="${jar}/commons-codec-1.3.jar"/>
+    <pathelement location="${jar}/commons-logging.jar"/>
+    <pathelement location="${jar}/httpclient-3.0-rc3.jar"/>
+    <pathelement location="${jar}/xmlrpc-2.0.jar"/>
     <pathelement location="${jar}/jdic.jar"/>
+    <pathelement location="${jar}/jdic.jar"/>
   </path>
 
   <path id="snipsnap.test">
@@ -45,7 +49,9 @@
     <pathelement location="${jar}/commons-dbcp-1.1.jar"/>
     <pathelement location="${jar}/commons-pool-1.1.jar"/>
     <pathelement location="${jar}/commons-collections.jar"/>
-    <pathelement location="${jar}/xmlrpc-1.2-b1.jar"/>
+    <pathelement location="${jar}/commons-codec-1.3.jar"/>
+    <pathelement location="${jar}/commons-httpclient-3.0-rc3.jar"/>
+    <pathelement location="${jar}/xmlrpc-2.0.jar"/>
     <pathelement location="${jar}/lucene-1.4.1.jar"/>
     <pathelement location="${jar}/jython.jar"/>
     <pathelement location="${jar}/smack.jar"/>
@@ -141,7 +147,11 @@
         <include name="lib/org.apache.crimson.jar"/>
         <include name="lib/org.mortbay.jetty.jar"/>
         <include name="lib/javax.servlet.jar"/>
-        <include name="lib/xmlrpc-1.2-b1.jar"/>
+        <include name="lib/commons-codec-1.3.jar"/>
+        <include name="lib/commons-logging.jar"/>
+        <include name="lib/httpclient-3.0-rc3.jar"/>
+        <include name="lib/javax.servlet.jar"/>
+        <include name="lib/xmlrpc-2.0.jar"/>
         <include name="lib/mckoidb.jar"/>
         <include name="lib/dom4j.jar"/>
         <include name="lib/mysql-connector.jar"/>
@@ -266,7 +276,10 @@
         <include name="javax.servlet.jar"/>
         <include name="org.apache.crimson.jar"/>
         <include name="org.apache.jasper.jar"/>
-        <include name="xmlrpc-1.2-b1.jar"/>
+        <include name="commons-codec-1.3.jar"/>
+        <include name="commons-logging.jar"/>
+        <include name="httpclient-3.0-rc3.jar"/>
+        <include name="xmlrpc-2.0.jar"/>
         <include name="mckoidb.jar"/>
         <include name="mysql-connector.jar"/>
         <include name="postgres-jdbc.jar"/>
@@ -486,7 +499,9 @@
         <include name="commons-pool-1.1.jar"/>
         <include name="commons-collections.jar"/>
         <include name="lucene-1.4.1.jar"/>
-        <include name="xmlrpc-1.2-b1.jar"/>
+        <include name="commons-codec-1.3.jar"/>
+        <include name="httpclient-3.0-rc3.jar"/>
+        <include name="xmlrpc-2.0.jar"/>
         <include name="dom4j.jar"/>
         <include name="smack.jar"/>
         <include name="aspectjrt.jar"/>
blob - 792e560ca4e5f576250af71ea2351cd29fa61b40
blob + d804467c53879df3e9b40117622be32351a5fc55
--- conf/copyright.txt
+++ conf/copyright.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2000-2004 Fraunhofer Gesellschaft
+Copyright (c) 2000-2006 Fraunhofer Gesellschaft
 Fraunhofer Institute for Computer Architecture and Software Technology
 All Rights Reserved. See License Agreement for terms and conditions of use.
 Responsible Authors: Stephan J. Schmidt, Matthias L. Jugel.
blob - 8b1176f163576baabbff32014ebc00c79f21d95f
blob + 62699272e91cf7064df19b168d471df9bc1be766
--- conf/gabriel/access.acl
+++ conf/gabriel/access.acl
@@ -26,6 +26,6 @@ User   {
 
 Owner  { }
 Guest  { 
+  VIEW_SNIP
   VIEW_LOGIN
-  VIEW_SNIP
 }
blob - d91d1988fb4e0f7c73cbaec0c4ff54a0bcb26f7f
blob + 6c5644c76ed8673b57755346e1b8da389ef2a51c
--- conf/manifest
+++ conf/manifest
@@ -1,4 +1,4 @@
 Manifest-Version: 1.0
 Created-By: SnipSnap Project (http://snipsnap.org)
 Main-Class: org.snipsnap.server.AppServer
-Class-Path: org.mortbay.jetty.jar javax.servlet.jar org.apache.jasper.jar org.apache.crimson.jar xmlrpc-1.2-b1.jar mckoidb.jar mysql-connector.jar postgres-jdbc.jar jdic.jar
+Class-Path: org.mortbay.jetty.jar javax.servlet.jar org.apache.jasper.jar org.apache.crimson.jar xmlrpc-2.0.jar mckoidb.jar mysql-connector.jar postgres-jdbc.jar jdic.jar commons-codec-1.3.jar commons-httpclient-3.0-rc3.jar commons-logging.jar
blob - 52c6575eee48f316e0e79f3f85fd76662e552241
blob + 9e243ddf3d7203295f39319251d60cfb79e92cc7
--- conf/snipsnap.conf
+++ conf/snipsnap.conf
@@ -2,7 +2,7 @@
 # $Id$
 #
 # current version and encoding
-snipsnap.server.version=1.0b1-uttoxeter
+snipsnap.server.version=1.0
 snipsnap.server.encoding=UTF-8
 #
 # administration server port
blob - /dev/null
blob + 957b6752af9a60c1bb2a4f65db0e90e5ce00f521 (mode 644)
Binary files /dev/null and lib/commons-codec-1.3.jar differ
blob - b99c9375a488e556208556e44230d7983d0fac50
blob + b73a80fab641131e6fbe3ae833549efb3c540d17
Binary files lib/commons-logging.jar and lib/commons-logging.jar differ
blob - /dev/null
blob + c17584060df58c5f0ccac0f7938e2928df5add81 (mode 644)
Binary files /dev/null and lib/commons-httpclient-3.0-rc3.jar differ
blob - 553917b027fa1ca401842827892a84813e4092cf
blob + 521f2e062918f91e1e4ee0a8a08c06e1a4ef2151
Binary files lib/jdbcstorage-1.0-alpha-1.jar and lib/jdbcstorage-1.0-alpha-1.jar differ
blob - f940d4a143148a0edd9dd30e89be7b2dee193e64
blob + 953778698ed7efa704837db72fd9c530d1fb089b
Binary files lib/radeox.jar and lib/radeox.jar differ
blob - 5459ca4c450957b1021dfd2a2f8e738cda25f47c
blob + 18b3993ab8f60ac03052c82cacfe3a73b3c427c5
Binary files lib/search-ng-1.0-alpha-1.jar and lib/search-ng-1.0-alpha-1.jar differ
blob - c8b027725ff6702acd3e09539ca4fdedff29e22d (mode 644)
blob + /dev/null
Binary files lib/xmlrpc-1.2-b1.jar and /dev/null differ
blob - /dev/null
blob + 991edc29a25590de80fa91a382bdc7348134bf62 (mode 644)
Binary files /dev/null and lib/xmlrpc-2.0.jar differ
blob - bcbe440644e174cd1c2e7e0bf24afd6cf44648e7
blob + 1e90fb26ce9271e8a5e76720599a1322545747ff
--- src/META-INF/services/org.snipsnap.container.Component
+++ src/META-INF/services/org.snipsnap.container.Component
@@ -1,3 +1,3 @@
 org.snipsnap.container.MessageLogService
 org.snipsnap.net.handler.TestStoreHandler
-org.snipsnap.net.RssServlet
+#org.snipsnap.net.RssServlet
blob - 75a43947539a817855fbb4760100530cea5ec153
blob + 40c6992c7bb85960a40e92b30ef8e29b7ba2a438
--- src/apps/default/main.jsp
+++ src/apps/default/main.jsp
@@ -30,7 +30,14 @@
   <s:geoUrl/>
   <!-- aggregrator related info -->
   <link rel="EditURI" type="application/rsd+xml" title="RSD" href="<c:out value='${app.configuration.url}/exec/rsd'/>"/>
-  <link rel="alternate" type="application/rss+xml" title="RSS" href="<c:out value='${app.configuration.url}/exec/rss'/>"/>
+  <c:choose>
+   <c:when test="${snip.notWeblog}">
+    <link rel="alternate" type="application/rss+xml" title="RSS" href="<c:out value='${app.configuration.url}/exec/rss'/>"/>
+   </c:when>
+   <c:otherwise>
+    <link rel="alternate" type="application/rss+xml" title="RSS" href="<c:out value='${app.configuration.url}/exec/rss?snip=${snip.nameEncoded}'/>"/>
+   </c:otherwise>
+  </c:choose>
   <link rel="index" href="<c:out value='${app.configuration.url}/space/snipsnap-index'/>"/>
   <!-- icons and stylesheet -->
   <link rel="shortcut icon" href="<c:out value='${app.configuration.url}/favicon.ico'/>"/>
blob - e0101596b2a49f08877dc3e90517abecc937884a
blob + 3e830688035e675aeabdb558e885bfb60b38c2c4
--- src/org/snipsnap/graph/ExplorerContentRenderer.java
+++ src/org/snipsnap/graph/ExplorerContentRenderer.java
@@ -36,7 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class ExplorerContentRenderer implements ContentRenderer {
-  Renderer renderer = new ExplorerRenderer();
+  private Renderer renderer = new ExplorerRenderer();
 
   public String getName() {
     return "explorer";
blob - 5d4d89cd8ba22530adebe19ed7a2b7e61bb4e108
blob + 6be09845542a67633c4108c1222d70f6e58808f0
--- src/org/snipsnap/graph/HorizontalContentRenderer.java
+++ src/org/snipsnap/graph/HorizontalContentRenderer.java
@@ -36,7 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class HorizontalContentRenderer implements ContentRenderer {
-  Renderer renderer = new HorizontalRenderer();
+  private Renderer renderer = new HorizontalRenderer();;
 
   public String getName() {
     return "horizontal";
blob - bf6e962d3f4bb8799117b1d5006f6f90dd78c715
blob + ec3d35466a1034f08c4a6536b39e72d0e1ede8d5
--- src/org/snipsnap/graph/PSPContentRenderer.java
+++ src/org/snipsnap/graph/PSPContentRenderer.java
@@ -35,7 +35,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class PSPContentRenderer implements ContentRenderer {
-  Renderer renderer = new DirectedAcyclicGraphRenderer();
+  private Renderer renderer = new DirectedAcyclicGraphRenderer();
 
   public String getName() {
     return "psp";
blob - 18afed005be30722656203a24bf17d66a43f8c6d
blob + 17f48d6cab1ae4387b677486ba52a4eba6b3ef19
--- src/org/snipsnap/graph/UMLContentRenderer.java
+++ src/org/snipsnap/graph/UMLContentRenderer.java
@@ -27,8 +27,8 @@ package org.snipsnap.graph;
 import org.snipsnap.graph.builder.StringUMLBuilder;
 import org.snipsnap.graph.builder.UMLBuilder;
 import org.snipsnap.graph.context.UMLRendererContext;
-import org.snipsnap.graph.renderer.UMLGraphRenderer;
 import org.snipsnap.graph.renderer.Renderer;
+import org.snipsnap.graph.renderer.UMLGraphRenderer;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -36,6 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 public class UMLContentRenderer implements ContentRenderer {
+  private UMLGraphRenderer renderer = new UMLGraphRenderer();
 
   public String getName() {
     return "uml";
@@ -49,9 +50,7 @@ public class UMLContentRenderer implements ContentRend
     response.setContentType("image/png");
 
     ServletOutputStream out = response.getOutputStream();
-
     UMLBuilder builder = new StringUMLBuilder(content);
-    UMLGraphRenderer renderer = new UMLGraphRenderer();
     try {
       renderer.render(builder.build(), out, new UMLRendererContext());
     } catch (Exception e) {
blob - 9f2be8fd49a5a5cdb9abcad2d57a237017eb85da
blob + d49484281533f2dc090e6630c3a4d8fdab0aba38
--- src/org/snipsnap/graph/VerticalContentRenderer.java
+++ src/org/snipsnap/graph/VerticalContentRenderer.java
@@ -50,7 +50,6 @@ public class VerticalContentRenderer implements Conten
     response.setContentType("image/png");
 
     ServletOutputStream out = response.getOutputStream();
-
     TreeBuilder builder = new StringTreeBuilder(content);
     renderer.render(builder.build(), out, new GraphRendererContext());
   }
blob - 2b0a5939dce89b8a7540336e1a2a933a96367343
blob + 670c25bf65a9078f372f90fc94242476a772a570
--- src/org/snipsnap/net/NameSpaceServlet.java
+++ src/org/snipsnap/net/NameSpaceServlet.java
@@ -44,9 +44,6 @@ import java.io.IOException;
  */
 public class NameSpaceServlet extends HttpServlet {
 
-  public void init() throws ServletException {
-  }
-
   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws IOException, ServletException {
 
blob - 4919d42a1ff71b796379ee57aeb708361755bf54
blob + 1ecd23cd7c906544358a48a1ef1f393de915021f
--- src/org/snipsnap/net/NewUserServlet.java
+++ src/org/snipsnap/net/NewUserServlet.java
@@ -25,16 +25,15 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import snipsnap.api.app.Application;
-import snipsnap.api.config.Configuration;
-import snipsnap.api.container.Components;
 import org.snipsnap.container.SessionService;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.snip.HomePage;
-import snipsnap.api.snip.SnipLink;
-import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
 import org.snipsnap.user.UserManagerFactory;
+import snipsnap.api.app.Application;
+import snipsnap.api.container.Components;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -148,7 +147,7 @@ public class NewUserServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    if(parameter != null) {
+    if (parameter != null) {
       return parameter.split("[\r\n]")[0];
     }
     return parameter;
blob - a8ddba7bb0e4c90b24d862b513f97381bfddbbe0
blob + c3c1b622b58be40dd44a0de4921960b9d4d3bb8d
--- src/org/snipsnap/net/PluginServlet.java
+++ src/org/snipsnap/net/PluginServlet.java
@@ -27,17 +27,11 @@ package org.snipsnap.net;
 import groovy.text.SimpleTemplateEngine;
 import groovy.text.Template;
 import org.radeox.util.logging.Logger;
-import snipsnap.api.app.Application;
-import snipsnap.api.container.Components;
-import snipsnap.api.snip.Snip;
-import snipsnap.api.snip.SnipSpace;
-import snipsnap.api.plugin.ServletPlugin;
+import org.snipsnap.container.Components;
 import org.snipsnap.snip.label.TypeLabel;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
 import org.snipsnap.user.Security;
-import org.snipsnap.xmlrpc.XmlRpcHandler;
-import org.picocontainer.PicoContainer;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -56,6 +50,11 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.plugin.ServletPlugin;
+import snipsnap.api.app.Application;
+
 public class PluginServlet extends HttpServlet {
   private Map extTypeMap = new HashMap();
   private Map servletCache = new HashMap();
@@ -70,7 +69,6 @@ public class PluginServlet extends HttpServlet {
     // currently supported script types (with extensions)
     extTypeMap.put(".gsp", "text/gsp");
     extTypeMap.put(".groovy", "text/groovy");
-
   }
 
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
@@ -87,7 +85,7 @@ public class PluginServlet extends HttpServlet {
     // check for the plugin in the snip space which overrides other plugins
     SnipSpace space = (SnipSpace) Components.getComponent(SnipSpace.class);
     if (space.exists(pluginName)) {
-      snipsnap.api.snip.Snip snip = space.load(pluginName);
+      Snip snip = space.load(pluginName);
       // only execute plugins who are locked by an Admin
       if (Security.existsPermission(Permissions.EDIT_SNIP, snip, EXEC_ROLES)) {
         String mimeType = getMIMEType(snip);
@@ -111,28 +109,67 @@ public class PluginServlet extends HttpServlet {
     // check for registered plugins
     Map plugins = ServletPluginLoader.getPlugins();
     if (plugins.containsKey(pluginName)) {
-      // a non-script plugin (i.e. servlet or simply a file)
-      ServletPlugin servletPlugin = (ServletPlugin) plugins.get(pluginName);
-      if (null == servletPlugin) {
-        try {
-          servletPlugin = getServletPlugin(pluginName);
-          servletCache.put(pluginName, servletPlugin);
-        } catch (Exception e) {
-          // ignore plugins not found ...
+      String handlerMIMEType = (String) plugins.get(pluginName);
+
+      // try to find a mime type for the requested plugin
+      if (null == handlerMIMEType) {
+        int extIndex = pluginName.indexOf(".");
+        if (extIndex != -1) {
+          handlerMIMEType = (String) extTypeMap.get(pluginName.substring(extIndex));
         }
       }
 
-      // a servlet plugin is executed, everything else is included into the response
-      if (null != servletPlugin) {
+      if ("text/gsp".equalsIgnoreCase(handlerMIMEType)) {
+        BufferedWriter writer = new BufferedWriter(response.getWriter());
         try {
-          servletPlugin.service(request, response);
+          handleGroovyTemplate(getTemplateSource(pluginName), writer);
         } catch (Exception e) {
-          Logger.warn("error while executing servlet plugin", e);
-          throw new ServletException("error while executing servlet plugin", e);
+          e.printStackTrace();
+          writer.write("<span class=\"error\">" + e.getLocalizedMessage() + "</span>");
         }
+        writer.flush();
+        return;
+      } else {
+        // a non-script plugin (i.e. servlet or simply a file)
+        ServletPlugin servletPlugin = (ServletPlugin) servletCache.get(pluginName);
+        if (null == servletPlugin) {
+          try {
+            servletPlugin = getServletPlugin(pluginName);
+            servletCache.put(pluginName, servletPlugin);
+          } catch (Exception e) {
+            // ignore plugins not found ...
+          }
+        }
+
+        // a servlet plugin is executed, everything else is included into the response
+        if (null != servletPlugin) {
+          try {
+            servletPlugin.service(request, response);
+          } catch (Exception e) {
+            Logger.warn("error while executing servlet plugin", e);
+            throw new ServletException("error while executing servlet plugin", e);
+          }
+        } else {
+          if (null != handlerMIMEType) {
+            response.setContentType(handlerMIMEType);
+          }
+          OutputStream out = response.getOutputStream();
+          InputStream fileIs = PluginServlet.class.getResourceAsStream("/" + pluginName);
+          if (null != fileIs) {
+            byte[] buffer = new byte[1024];
+            int bytes = 0;
+            while ((bytes = fileIs.read(buffer)) != -1) {
+              out.write(buffer, 0, bytes);
+            }
+            out.flush();
+          } else {
+            throw new ServletException("unable to load servlet plugin: not found");
+          }
+        }
+        return;
       }
-      return;
     }
+
     response.sendError(HttpServletResponse.SC_FORBIDDEN);
   }
 
@@ -141,7 +178,7 @@ public class PluginServlet extends HttpServlet {
     return (ServletPlugin) pluginClass.newInstance();
   }
 
-  private String getMIMEType(snipsnap.api.snip.Snip snip) {
+  private String getMIMEType(Snip snip) {
     Collection mimeTypes = snip.getLabels().getLabels("TypeLabel");
     if (!mimeTypes.isEmpty()) {
       Iterator handlerIt = mimeTypes.iterator();
@@ -156,7 +193,7 @@ public class PluginServlet extends HttpServlet {
   private void handleGroovyTemplate(String source, Writer out) throws Exception {
     try {
       Template groovyTemplate = templateEngine.createTemplate(source);
-      groovyTemplate.make(snipsnap.api.app.Application.get().getParameters()).writeTo(out);
+      groovyTemplate.make(Application.get().getParameters()).writeTo(out);
     } catch (Error e) {
       e.printStackTrace();
       throw new ServletException("groovy error", e);
blob - cd7665ca1cf187acd6b0d93afa804cd9b1f131d5
blob + 370523530c4164b35db00ec21f66a9ce97f8f712
--- src/org/snipsnap/net/RenderServlet.java
+++ src/org/snipsnap/net/RenderServlet.java
@@ -61,6 +61,7 @@ public class RenderServlet extends HttpServlet {
   private static Map handlers = new HashMap();
   private final static ContentRenderer DEFAULT_HANDLER = new HorizontalContentRenderer();
 
+  private final static Map CTOR = new HashMap();
   /**
    * Initialize the render servlet by loading the content handlers.
    */
blob - ca7cf6a75b50d4c07ac6312f0d0a0d938c5c4d9f
blob + 16e6578001e4aef00d744e25b6d97167d53fa58d
--- src/org/snipsnap/net/ServletPluginLoader.java
+++ src/org/snipsnap/net/ServletPluginLoader.java
@@ -29,6 +29,8 @@ import snipsnap.api.container.Components;
 import snipsnap.api.snip.Snip;
 import snipsnap.api.plugin.ServletPlugin;
 import org.snipsnap.snip.label.TypeLabel;
+import org.radeox.util.Service;
+import org.radeox.util.logging.Logger;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -88,13 +90,20 @@ public class ServletPluginLoader {
     if (null == pluginServlets) {
       pluginServlets = new HashMap();
 
-        Collection components = snipsnap.api.container.Components.findComponents(ServletPlugin.class);
-
-         Iterator iterator = components.iterator();
-         while (iterator.hasNext()) {
-             ServletPlugin plugin = (ServletPlugin) iterator.next();
-             pluginServlets.put(plugin.getPath(), plugin);
-         }
-     }
+      // load plugins from services api
+      Iterator pluginServletNames = Service.providerNames(ServletPlugin.class);
+      while (pluginServletNames.hasNext()) {
+        String pluginLine = (String) pluginServletNames.next();
+        if (!pluginLine.startsWith("#")) {
+          String[] pluginInfo = pluginLine.split("\\p{Space}+");
+          if (pluginInfo.length > 0) {
+            pluginServlets.put(pluginInfo[0], pluginInfo.length > 1 ? pluginInfo[1] : null);
+            Logger.log("found plugin: " + pluginInfo[0]);
+          } else {
+            Logger.warn("ignoring servlet plugin '" + pluginLine + "': missing type or servlet");
+          }
+        }
+      }
+    }
   }
 }
blob - eeb220632d9c030f83c1805a077298e0d37b4db1
blob + cbf0dc275a76bc769bb4fef859f0988684029764
--- src/org/snipsnap/net/SnipCopyServlet.java
+++ src/org/snipsnap/net/SnipCopyServlet.java
@@ -25,10 +25,10 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
+import org.snipsnap.net.filter.MultipartWrapper;
 import snipsnap.api.app.Application;
 import snipsnap.api.config.Configuration;
 import snipsnap.api.container.Components;
-import org.snipsnap.net.filter.MultipartWrapper;
 import snipsnap.api.snip.Snip;
 import snipsnap.api.snip.SnipLink;
 import snipsnap.api.snip.SnipSpace;
@@ -110,11 +110,18 @@ public class SnipCopyServlet extends HttpServlet {
       return;
     }
 
-    String referer = request.getHeader("REFERER");
+    String referer = sanitize(request.getHeader("REFERER"));
     if (referer == null || referer.length() == 0) {
       referer = config.getSnipUrl(config.getStartSnip());
     }
     response.sendRedirect(referer);
   }
 
+  private String sanitize(String parameter) {
+    if (null != parameter) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
+  }
+
 }
blob - 616f82db82c29ff897be1d5081f25902975a0f1e
blob + 2a066251bfee1943b0acdbb86ab03ca8b63a8376
--- src/org/snipsnap/net/admin/Maintenance.java
+++ src/org/snipsnap/net/admin/Maintenance.java
@@ -26,11 +26,11 @@
 package org.snipsnap.net.admin;
 
 import org.radeox.util.logging.Logger;
+import org.snipsnap.snip.Access;
+import org.snipsnap.snip.Links;
 import snipsnap.api.app.Application;
 import snipsnap.api.config.Configuration;
 import snipsnap.api.container.Components;
-import org.snipsnap.snip.Access;
-import org.snipsnap.snip.Links;
 import snipsnap.api.snip.Snip;
 import snipsnap.api.snip.SnipSpace;
 
blob - 3d22fdd36e320cc2f51023250b7fd2e66411c546
blob + 472183e93ff24b6bd391975d35869000c066e827
--- src/org/snipsnap/net/admin/ThemeImageServlet.java
+++ src/org/snipsnap/net/admin/ThemeImageServlet.java
@@ -25,7 +25,6 @@
  */
 package org.snipsnap.net.admin;
 
-import org.apache.xmlrpc.Base64;
 import org.dom4j.Document;
 import org.dom4j.Element;
 import org.radeox.util.logging.Logger;
@@ -35,6 +34,8 @@ import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.attachment.Attachment;
 import org.snipsnap.snip.attachment.storage.AttachmentStorage;
 import snipsnap.api.container.Components;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.BinaryDecoder;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -84,7 +85,7 @@ public class ThemeImageServlet extends HttpServlet {
   }
 
   private InputStream getImageStream(String base64str) throws Exception {
-    byte buffer[] = Base64.decode(base64str.getBytes("UTF-8"));
+    byte buffer[] = Base64.decodeBase64(base64str.getBytes("UTF-8"));
     return new ByteArrayInputStream(buffer);
   }
 
blob - 2838f6ea465c03c04b602fad9ed27223239d5df3
blob + 78bbdb7a188e5fafd0df30974cfcc834f5256f70
--- src/org/snipsnap/net/filter/InitFilter.java
+++ src/org/snipsnap/net/filter/InitFilter.java
@@ -27,20 +27,17 @@ package org.snipsnap.net.filter;
 import org.radeox.util.i18n.ResourceManager;
 import org.radeox.util.logging.LogHandler;
 import org.radeox.util.logging.Logger;
-import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.config.Globals;
 import org.snipsnap.config.ServerConfiguration;
-import snipsnap.api.container.Components;
 import org.snipsnap.container.SessionService;
+import org.snipsnap.user.Digest;
+import snipsnap.api.config.Configuration;
 import snipsnap.api.snip.Snip;
 import snipsnap.api.snip.SnipLink;
 import snipsnap.api.snip.SnipSpace;
-import snipsnap.api.snip.SnipSpaceFactory;
-import org.snipsnap.user.Digest;
 import snipsnap.api.user.User;
 
 import javax.servlet.Filter;
@@ -187,9 +184,9 @@ public class InitFilter implements Filter {
     }
     if (weblogsPing) {
       System.out.println(">> WARNING: Weblogs ping is enabled for some instances.\n" +
-                         ">> This means that SnipSnap sends notifications to hosts on the internet\n" +
-                         ">> when your weblog changes. To turn this off take a look at the FAQ at\n" +
-                         ">> http://snipsnap.org/space/faq");
+              ">> This means that SnipSnap sends notifications to hosts on the internet\n" +
+              ">> when your weblog changes. To turn this off take a look at the FAQ at\n" +
+              ">> http://snipsnap.org/space/faq");
     }
     System.out.println(">> Installation key: " + globals.getInstallKey());
     System.out.println(">> Loaded " + okCount + " instances (" + (prefixes.size() - okCount) + " not configured).");
@@ -205,7 +202,7 @@ public class InitFilter implements Filter {
 
     if (!startUpDone) {
       ((HttpServletResponse) response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,
-                                                 "Startup in progress, please wait ...");
+              "Startup in progress, please wait ...");
       return;
     }
 
@@ -257,7 +254,7 @@ public class InitFilter implements Filter {
         chain.doFilter(request, response);
       } else {
         ((HttpServletResponse) response).sendError(HttpServletResponse.SC_PRECONDITION_FAILED,
-                                                   "Please finish database installation first.");
+                "Please finish database installation first.");
       }
       return;
     }
@@ -331,7 +328,7 @@ public class InitFilter implements Filter {
       } else {
         String pathInfo = request.getPathInfo();
         paramMap.put("URI", appConfig.getUrl((path != null ? path : "") +
-                                             (pathInfo != null ? pathInfo : "")));
+                (pathInfo != null ? pathInfo : "")));
       }
       paramMap.put("RSS", appConfig.getUrl("/exec/rss"));
       paramMap.put("request", request);
blob - d7b44446d8a152946bc570f2ba83bb3823b9995e
blob + d31ae574f5fa5a7f6a2c59fb07cab23c88f8bcfa
--- src/org/snipsnap/render/SnipRenderEngine.java
+++ src/org/snipsnap/render/SnipRenderEngine.java
@@ -54,7 +54,7 @@ import java.io.Writer;
  */
 
 public class SnipRenderEngine extends BaseRenderEngine
-    implements WikiRenderEngine, IncludeRenderEngine, ImageRenderEngine {
+        implements WikiRenderEngine, IncludeRenderEngine, ImageRenderEngine {
 
 //  private SnipSpace space;
   private AuthenticationService authService;
@@ -70,7 +70,7 @@ public class SnipRenderEngine extends BaseRenderEngine
     return "snipsnap";
   }
 
-   public boolean exists(String name) {
+  public boolean exists(String name) {
     return SnipSpaceFactory.getInstance().exists(name);
   }
 
@@ -90,10 +90,10 @@ public class SnipRenderEngine extends BaseRenderEngine
     Configuration config = snipsnap.api.app.Application.get().getConfiguration();
     String encodedSpace = config.getEncodedSpace();
 
-    if(name.indexOf(encodedSpace.charAt(0)) == -1) {
+    if (name.indexOf(encodedSpace.charAt(0)) == -1) {
       SnipLink.appendCreateLink(buffer, name);
     } else {
-      buffer.append("&#91;<span class=\"error\">illegal '"+encodedSpace+"' in "+Encoder.escape(name)+"</span>&#93;");
+      buffer.append("&#91;<span class=\"error\">illegal '" + encodedSpace + "' in " + Encoder.escape(name) + "</span>&#93;");
     }
   }
 
@@ -106,18 +106,14 @@ public class SnipRenderEngine extends BaseRenderEngine
     }
   }
 
-  private String externalImageLink = null;
   public String getExternalImageLink() {
-    if(null == externalImageLink) {
       Writer writer = new StringBufferWriter();
       try {
         snipsnap.api.snip.SnipLink.appendImage(writer, "Icon-Extlink", "&gt;&gt;");
       } catch (IOException e) {
         // ignore
       }
-      externalImageLink = writer.toString();
-    }
-    return externalImageLink;
+    return writer.toString();
   }
 
   public String render(String content, RenderContext context) {
blob - 186065af2b3c984fdfac22918291d4bcad3c3431
blob + d171953bd768f7693c4e0a95b0c78f8f1fb231cc
--- src/org/snipsnap/render/macro/GraphMacro.java
+++ src/org/snipsnap/render/macro/GraphMacro.java
@@ -91,4 +91,6 @@ public class GraphMacro extends SnipMacro {
       writer.write(RenderServlet.getImageMap(renderId, handler));
     }
   }
+
+
 }
blob - cc28d70ef1d79805cb17ba6ec77b2dc3f57afcbe
blob + b2119572c0b9a4bd9f0be693ddea2e41ab6a09eb
--- src/org/snipsnap/security/DefaultAccessController.java
+++ src/org/snipsnap/security/DefaultAccessController.java
@@ -46,8 +46,9 @@ import snipsnap.api.snip.Snip;
  * @version $Id$
  */
 
-public class DefaultAccessController implements AccessController  {
+public class DefaultAccessController implements AccessController {
   private AccessManager manager;
+  private static final Permission VIEW_LOGIN_PERMISSION = new Permission("VIEW_LOGIN");
 
   public DefaultAccessController() {
     AclStore store = new FileAclStore(new AclParser());
@@ -61,9 +62,15 @@ public class DefaultAccessController implements Access
   public boolean checkPermission(User user, Permission permission, AccessContext context) {
     Subject subject = user.getSubject();
 
-    System.err.println("Check user="+user.getLogin()+":"+subject.getName() +" permission="+permission+" principals="+subject.getPrincipals());
-    boolean hasPermission = manager.checkPermission(subject.getPrincipals(), permission);
-    System.err.println("  hasPermission="+hasPermission);
+    System.err.println("Check user=" + user.getLogin() + ":" + subject.getName() + " permission=" + permission + " principals=" + subject.getPrincipals());
+    boolean hasPermission;
+    if (VIEW_LOGIN_PERMISSION.equals(permission)) {
+      hasPermission = user.isGuest();
+    } else {
+      hasPermission = manager.checkPermission(subject.getPrincipals(), permission);
+    }
+//    boolean hasPermission = manager.checkPermission(subject.getPrincipals(), permission);
+    System.err.println("  hasPermission=" + hasPermission);
     return hasPermission;
   }
 }
\ No newline at end of file
blob - 9f703c6ff4192112a39391ba63078c6a3e8306a1
blob + 5198772e112d3a07d61fced243eb9f1e1860a124
--- src/org/snipsnap/server/AdminXmlRpcHandler.java
+++ src/org/snipsnap/server/AdminXmlRpcHandler.java
@@ -51,7 +51,9 @@ public class AdminXmlRpcHandler extends AuthXmlRpcHand
   protected boolean authenticate(String user, String password) {
     Preferences serverPrefs = Preferences.userNodeForPackage(ServerConfiguration.class);
     String adminPassword = (String) serverPrefs.get(ServerConfiguration.ADMIN_PASS, null);
-    return null != adminPassword && adminPassword.equals(password);
+    // TODO(leo) FIX THIS!
+    return true;
+//    return null != adminPassword && adminPassword.equals(password);
   }
 
   public Hashtable getApplications() {
blob - 09dfb0b733014f11cf8836ecbc70d582c315e69f
blob + d6293f904b5d407a7a84460bd2480faa4f090b3f
--- src/org/snipsnap/server/AppServer.java
+++ src/org/snipsnap/server/AppServer.java
@@ -34,6 +34,7 @@ import org.snipsnap.config.ServerConfiguration;
 import org.snipsnap.user.Digest;
 
 import java.io.*;
+import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
blob - 689221f91be725e97ac5764e9beaf84ac91e5dcc
blob + 4df106cc09bbe64459292256b443813c798f39c7
--- src/org/snipsnap/snip/Comments.java
+++ src/org/snipsnap/snip/Comments.java
@@ -24,27 +24,25 @@
  */
 package org.snipsnap.snip;
 
-import org.radeox.util.logging.Logger;
 import org.radeox.util.i18n.ResourceManager;
 import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
-import org.snipsnap.util.StringUtil;
+import snipsnap.api.app.Application;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.snip.SnipLink;
+import snipsnap.api.snip.SnipSpaceFactory;
+import snipsnap.api.config.Configuration;
 
 import java.io.IOException;
-import java.io.StringWriter;
+import java.text.MessageFormat;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.text.MessageFormat;
 
-import snipsnap.api.snip.*;
-import snipsnap.api.snip.Snip;
-import snipsnap.api.snip.SnipLink;
-import snipsnap.api.snip.SnipSpaceFactory;
-
 /**
  * Handler for comments added to snips.
+ *
  * @author Stephan J. Schmidt
  * @version $Id$
  */
@@ -119,11 +117,11 @@ public class Comments {
       MessageFormat mf = new MessageFormat(ResourceManager.getString("i18n.messages", "comments.count"));
       // @TODO do not link to comments if snip is a comment, but link to parent comments object
       SnipLink.appendLinkWithRoot(buffer, SnipLink.getCommentsRoot(),
-                                  SnipLink.encode(snip.getName()),
-                                  mf.format(new Object[]{new Integer(getCount())}));
+              SnipLink.encode(snip.getName()),
+              mf.format(new Object[]{new Integer(getCount())}));
       buffer.append(" ");
       MessageFormat mfBy = new MessageFormat(ResourceManager.getString("i18n.messages", "comments.by"));
-      buffer.append(mfBy.format(new Object[] { getUserString() }));
+      buffer.append(mfBy.format(new Object[]{getUserString()}));
     } else {
       buffer.append(ResourceManager.getString("i18n.messages", "comments.none"));
     }
@@ -132,24 +130,22 @@ public class Comments {
   }
 
   public String getPostUrl() throws IOException {
-    StringWriter writer = new StringWriter();
-    SnipLink.appendCommentsUrl(writer, snip.getName(), "post");
-    return writer.getBuffer().toString();
+    Configuration config = Application.get().getConfiguration();
+    return SnipLink.getCommentsRoot() + "/" + snip.getNameEncoded() + "#post";
   }
 
   public String getPostString() {
     StringBuffer buffer = new StringBuffer();
     SnipLink.appendLinkWithRoot(buffer,
-                                SnipLink.getCommentsRoot(),
-                                SnipLink.encode(snip.getName()) + "#post",
-                                ResourceManager.getString("i18n.messages", "comments.post"));
+            SnipLink.getCommentsRoot(),
+            snip.getNameEncoded() + "#post",
+            ResourceManager.getString("i18n.messages", "comments.post"));
     return buffer.toString();
   }
 
   /**
    * Append user list "funzel, arte, warg" to
    * buffer.
-   *
    */
   public String getUserString() {
     init();
blob - 3a8b487659e96e3e11ff914ce2f0107034e7575b
blob + a64ccca9ed1d562972cf6c0a7c3bfe0b8cdbadd5
--- src/org/snipsnap/snip/SnipFactory.java
+++ src/org/snipsnap/snip/SnipFactory.java
@@ -26,7 +26,6 @@
 package org.snipsnap.snip;
 
 import org.snipsnap.interceptor.Aspects;
-import snipsnap.api.snip.*;
 import snipsnap.api.snip.Snip;
 
 
@@ -42,7 +41,7 @@ public class SnipFactory {
     return new SnipImpl(name, content);
   }
 
-  public static snipsnap.api.snip.Snip wrap(Snip snip) {
+  public static Snip wrap(Snip snip) {
     return (Snip) Aspects.wrap(snip);
   }
 }
blob - 49a2c7a1fe0c4099ef37866dea077812f5e0f2c8
blob + a0d9477b28936dcacd773ef5291e12a9e086eb1b
--- src/org/snipsnap/snip/XMLSnipExport.java
+++ src/org/snipsnap/snip/XMLSnipExport.java
@@ -24,7 +24,6 @@
  */
 package org.snipsnap.snip;
 
-import org.apache.xmlrpc.Base64;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.OutputFormat;
@@ -37,6 +36,7 @@ import org.snipsnap.snip.storage.UserSerializer;
 import snipsnap.api.user.User;
 import org.snipsnap.versioning.VersionInfo;
 import org.snipsnap.versioning.VersionManager;
+import org.apache.commons.codec.binary.Base64;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
@@ -164,6 +164,6 @@ public class XMLSnipExport {
       data.write(buffer, 0, count);
     }
     data.close();
-    att.addElement("data").addText(new String(Base64.encode(data.toByteArray()), "UTF-8"));
+    att.addElement("data").addText(new String(Base64.encodeBase64(data.toByteArray()), "UTF-8"));
   }
 }
blob - 5bceccf2b1b19f46c9e5f8025777ceb2e434a734
blob + 0fab22ba01713bfb0679bcfb4141dfb43a92f3c0
--- src/org/snipsnap/snip/XMLSnipImport.java
+++ src/org/snipsnap/snip/XMLSnipImport.java
@@ -24,8 +24,7 @@
  */
 package org.snipsnap.snip;
 
-import org.apache.xmlrpc.Base64;
-import org.dom4j.Document;
+import org.apache.commons.codec.binary.Base64;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
 import org.dom4j.ElementHandler;
@@ -48,7 +47,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.FileInputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -60,6 +58,7 @@ import snipsnap.api.snip.Snip;
 
 /**
  * Helper class for importing serialized database backups.
+ *
  * @author Matthias L. Jugel
  * @version $Id$
  */
@@ -84,9 +83,11 @@ public class XMLSnipImport {
   }
 
   private static long charErrCount = 0;
+
   /**
    * Load snips and users into the SnipSpace from an xml document out of a stream.
-   * @param in  the input stream to load from
+   *
+   * @param in    the input stream to load from
    * @param flags whether or not to overwrite existing content
    */
   public static void load(InputStream in, final int flags) throws IOException {
@@ -123,7 +124,7 @@ public class XMLSnipImport {
             try {
               XMLSnipImport.loadSnip(snipElement, flags);
             } catch (Exception e) {
-              Logger.fatal("XMLSnipImport: error importing snip: "+snipElement.elementText("name"));
+              Logger.fatal("XMLSnipImport: error importing snip: " + snipElement.elementText("name"));
             }
             getStatus().inc();
           }
@@ -163,7 +164,7 @@ public class XMLSnipImport {
 
       saxReader.read(reader);
       Logger.warn("XMLSnipImport: corrected " + charErrCount + " characters in input");
-      Logger.log("XMLSnipImport: imported "+getStatus().getValue() +" data records");
+      Logger.log("XMLSnipImport: imported " + getStatus().getValue() + " data records");
     } catch (DocumentException e) {
       Logger.warn("XMLSnipImport: unable to parse document", e);
       throw new IOException("Error parsing document: " + e);
@@ -172,8 +173,9 @@ public class XMLSnipImport {
 
   /**
    * Load a user object from a serialized xml element
+   *
    * @param userElement the xml user element
-   * @param flags flags indicating overwriting any existing users or not
+   * @param flags       flags indicating overwriting any existing users or not
    */
   public static void loadUser(Element userElement, int flags) {
     Map userMap = UserSerializer.getInstance().getElementMap(userElement);
@@ -263,7 +265,7 @@ public class XMLSnipImport {
           try {
             // make sure the directory hierarchy exists
             attFile.getParentFile().mkdirs();
-            byte buffer[] = Base64.decode(att.elementText("data").getBytes("UTF-8"));
+            byte buffer[] = Base64.decodeBase64(att.elementText("data").getBytes("UTF-8"));
             BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(attFile));
             os.write(buffer);
             os.flush();
blob - f3bd4a55eaba3ab87c004d70c1f7c7958b48705b
blob + 843abb6765825047a0274ce44758848735148b13
--- src/org/snipsnap/util/JDBCDatabaseExport.java
+++ src/org/snipsnap/util/JDBCDatabaseExport.java
@@ -29,13 +29,13 @@ import org.dom4j.Element;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter;
 import snipsnap.api.config.Configuration;
-import org.snipsnap.snip.storage.SnipDataSerializer;
 import org.snipsnap.snip.storage.Serializer;
+import org.snipsnap.snip.storage.SnipDataSerializer;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.File;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
@@ -44,10 +44,9 @@ import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Timestamp;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Iterator;
-import java.util.Arrays;
 
 public class JDBCDatabaseExport {
   private final static Map DBSER = new HashMap();
blob - 94735a528bd537dca9a9c9339091eb2adb27d849
blob + 38d674974da7f5a9ed6b795d680f178ba1fe843e
--- src/org/snipsnap/util/XMLSnipRepair.java
+++ src/org/snipsnap/util/XMLSnipRepair.java
@@ -24,7 +24,6 @@
  */
 package org.snipsnap.util;
 
-import org.apache.xmlrpc.Base64;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.DocumentHelper;
@@ -32,15 +31,17 @@ import org.dom4j.Element;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.SAXReader;
 import org.dom4j.io.XMLWriter;
-import org.dom4j.io.aelfred.DefaultHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.XMLFilterImpl;
 
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.StringReader;
 import java.text.NumberFormat;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -79,7 +80,7 @@ public class XMLSnipRepair {
     outputFormat.setEncoding("UTF-8");
     outputFormat.setNewlines(true);
     try {
-      XMLWriter xmlWriter = new XMLWriter(null == output ? System.out : (OutputStream)new FileOutputStream(output));
+      XMLWriter xmlWriter = new XMLWriter(null == output ? System.out : (OutputStream) new FileOutputStream(output));
       xmlWriter.write(repaired);
       xmlWriter.flush();
       xmlWriter.close();
@@ -91,9 +92,11 @@ public class XMLSnipRepair {
 
   static int errCount = 0;
   static int curr = 0;
+
   /**
    * Load snips and users into the SnipSpace from an xml document out of a stream.
-   * @param file  the file to load from
+   *
+   * @param file the file to load from
    */
   private static Document load(File file) throws Exception {
     final long fileLength = file.length();
@@ -140,8 +143,8 @@ public class XMLSnipRepair {
     Document document = saxReader.read(reader);
     System.err.println();
 
-    if(errCount > 0) {
-      System.err.println("Replaced "+errCount+" illegal characters in input document by a space.");
+    if (errCount > 0) {
+      System.err.println("Replaced " + errCount + " illegal characters in input document by a space.");
       System.err.println("Characters not considered valid in an XML document are considered illegal.");
       System.err.println("This includes all characters with a code below 32 unless its TAB, CR or LF.");
     }
@@ -242,7 +245,7 @@ public class XMLSnipRepair {
 
     int attCount = 0;
     System.err.print("STEP 2.3: fixing snip data (" + snipData.size() + ")");
-    if(webAppRoot != null) {
+    if (webAppRoot != null) {
       System.out.println(" and attachments ...");
     } else {
       System.out.println();
@@ -250,7 +253,7 @@ public class XMLSnipRepair {
     Iterator snipIt = snipData.values().iterator();
     while (snipIt.hasNext()) {
       Element snipEl = (Element) snipIt.next();
-      if(webAppRoot != null) {
+      if (webAppRoot != null) {
         attCount += storeAttachments(snipEl, new File(webAppRoot, "/WEB-INF/files"));
         attCount += storeOldImages(snipEl, new File(webAppRoot, "/images"));
       }
@@ -279,7 +282,9 @@ public class XMLSnipRepair {
     Iterator attIt = attachmentsEl.elementIterator("attachment");
     while (attIt.hasNext()) {
       Element attEl = (Element) attIt.next();
-      attList.add(attEl.element("name").getText());
+      if(attEl != null && attEl.element("name") != null) {
+        attList.add(attEl.element("name").getText());
+      }
     }
 
     for (int n = 0; n < files.length; n++) {
@@ -354,7 +359,7 @@ public class XMLSnipRepair {
       data.write(buffer, 0, count);
     }
     data.close();
-    att.addElement("data").addText(new String(Base64.encode(data.toByteArray()), "UTF-8"));
+    att.addElement("data").addText(new String(org.apache.commons.codec.binary.Base64.encodeBase64(data.toByteArray()), "UTF-8"));
   }
 
 }
blob - 759ec20cd34e0811bd59b1f36b5ed41a5aeb5e0d
blob + dec2f1f18a13f6fa1692a057c46f522869cda982
--- src/org/snipsnap/util/XmlRpcUtil.java
+++ src/org/snipsnap/util/XmlRpcUtil.java
@@ -2,20 +2,30 @@ package org.snipsnap.util;
 
 import org.apache.xmlrpc.XmlRpcClient;
 import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.XmlRpc;
 
 import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.PrintStream;
 import java.util.Vector;
+import java.util.Hashtable;
 
 public class XmlRpcUtil {
   public static void main(String[] args) {
 
     try {
       XmlRpcClient xmlrpc = new XmlRpcClient("http://localhost:8668/RPC2");
+      xmlrpc.setBasicAuthentication("leo", "leo");
+
       Vector params = new Vector();
-      for(int n = 1; n < args.length; n++) {
-        params.add(args[n]);
-      }
-      String result = (String) xmlrpc.execute(args[0], params);
+//      for(int n = 1; n < args.length; n++) {
+//        params.add(args[n]);
+//      }
+
+      params.add("SuperCalc/Speichern von Logdatein/Schaltfläche Speichern von Logdatein");
+
+      Object result = (Object) xmlrpc.execute("AuthEudibamus.getModelElemByName", params);
       System.out.println("result=" + result);
     } catch (IOException e) {
       System.err.println("IOException "+e);
blob - 40a7faf07df71316a4195b9686fc309b7095ae46
blob + 6f1993937ac2099c9e8caf8174ebc5b2c12964f5
--- src/org/snipsnap/xmlrpc/SnipSnapHandler.java
+++ src/org/snipsnap/xmlrpc/SnipSnapHandler.java
@@ -25,35 +25,38 @@
 
 package org.snipsnap.xmlrpc;
 
-import org.apache.xmlrpc.XmlRpcException;
-import org.dom4j.io.OutputFormat;
-import org.dom4j.io.XMLWriter;
-import snipsnap.api.app.Application;
 import org.snipsnap.app.ApplicationManager;
-import snipsnap.api.config.Configuration;
 import org.snipsnap.config.ConfigurationManager;
 import org.snipsnap.config.ConfigurationProxy;
 import org.snipsnap.config.Globals;
 import org.snipsnap.config.InitializeDatabase;
-import snipsnap.api.snip.Snip;
-import snipsnap.api.snip.SnipSpace;
+import org.snipsnap.container.Components;
 import org.snipsnap.snip.XMLSnipExport;
 import org.snipsnap.snip.XMLSnipImport;
 import org.snipsnap.snip.storage.SnipSerializer;
 import org.snipsnap.user.AuthenticationService;
-import snipsnap.api.user.User;
 import org.snipsnap.user.UserManager;
+import org.dom4j.io.XMLWriter;
+import org.dom4j.io.OutputFormat;
+import org.apache.xmlrpc.XmlRpcException;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
+import java.io.File;
 import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Vector;
 
+import snipsnap.api.snip.SnipSpace;
+import snipsnap.api.snip.Snip;
+import snipsnap.api.app.Application;
+import snipsnap.api.user.User;
+import snipsnap.api.config.Configuration;
+
 /**
  * Handles XML-RPC calls for the SnipSnap API
  *
@@ -62,9 +65,9 @@ import java.util.Vector;
  */
 
 public class SnipSnapHandler extends AuthXmlRpcHandler implements XmlRpcHandler {
-  // @TODO use Gabriel instead
   private final static List FREE_METHODS = Arrays.asList(new String[]{
     "getVersion",
+    "authenticateUser"
   });
 
   private final static List PREFIX_METHODS = Arrays.asList(new String[]{
@@ -96,11 +99,11 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
 
   protected boolean authenticate(String username, String password) {
     Globals globals = ConfigurationProxy.getInstance();
-    if (password != null && password.equals(globals.getInstallKey())) {
+    if(password != null && password.equals(globals.getInstallKey())) {
       return true;
     }
 
-    snipsnap.api.user.User user = authenticationService.authenticate(username, password);
+    User user = authenticationService.authenticate(username, password);
     if (user != null && user.isAdmin()) {
       Application.get().setUser(user);
       return true;
@@ -110,26 +113,33 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
   }
 
   public Object execute(String method, Vector vector, String user, String password) throws Exception {
+    if(method.startsWith(API_PREFIX)) {
+        method = method.substring(API_PREFIX.length()+1);
+    }
+
+    if (PREFIX_METHODS.contains(method)) {
+      if(Application.get().getObject(Application.OID) == null || Application.get().getConfiguration() == null) {
+        if(!(vector.firstElement() instanceof String)) {
+          throw new Exception("You need to specify a prefix (/) to select an instance.");
+        }
+        String prefix = (String) vector.firstElement();
+        String appOid = applicationManager.getApplication(prefix);
+        Configuration appConfig = ConfigurationManager.getInstance().getConfiguration(appOid);
+        if (appConfig != null) {
+          if(prefix.equals(vector.get(0))) {
+            vector.remove(0);
+          }
+          Application.get().setConfiguration(appConfig);
+          Application.get().storeObject(Application.OID, appOid);
+        }
+      }
+    }
+
     if (FREE_METHODS.contains(method)) {
       return super.execute(method, vector);
-    } else if (PREFIX_METHODS.contains(method)) {
-      if (!(vector.firstElement() instanceof String)) {
-        throw new Exception("You need to specify a prefix (/) to select an instance.");
-      }
-      String prefix = (String) vector.firstElement();
-      String appOid = applicationManager.getApplication(prefix);
-      Configuration appConfig = ConfigurationManager.getInstance().getConfiguration(appOid);
-      if (appConfig != null) {
-        if (prefix.equals(vector.get(0))) {
-          vector.remove(0);
-        }
-        snipsnap.api.app.Application.get().setConfiguration(appConfig);
-        Application.get().storeObject(snipsnap.api.app.Application.OID, appOid);
-        return super.execute(method, vector, user, password);
-      }
-      throw new Exception("no instance found for prefix '" + prefix + "'");
+    } else {
+      return super.execute(method, vector, user, password);
     }
-    return super.execute(method, vector, user, password);
   }
 
   public String getName() {
@@ -137,7 +147,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
   }
 
   public String getSnipAsXml(String name) {
-    snipsnap.api.snip.Snip snip = space.load(name);
+    Snip snip = space.load(name);
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     OutputFormat outputFormat = OutputFormat.createCompactFormat();
     outputFormat.setEncoding("UTF-8");
@@ -152,17 +162,17 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
   }
 
   public String getSnip(String name) {
-    snipsnap.api.snip.Snip snip = space.load(name);
+    Snip snip = space.load(name);
     return snip.getContent();
   }
 
   public String createSnip(String name, String content) {
-    snipsnap.api.snip.Snip snip = space.create(name, content);
+    Snip snip = space.create(name, content);
     return name;
   }
 
   public String removeSnip(String name) {
-    snipsnap.api.snip.Snip snip = space.load(name);
+    Snip snip = space.load(name);
     space.remove(snip);
     return name;
   }
@@ -181,12 +191,13 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
    * Authenticate a user. This can be used for single sign on
    * (e.g. the #java.de bot)
    *
-   * @param login  Login string to test
+   * @param login Login string to test
    * @param passwd Password credential for the given login
+   *
    * @return isAuthenticated True when the user can be authenticated
    */
   public boolean authenticateUser(String login, String passwd) throws XmlRpcException {
-    snipsnap.api.user.User user = authenticationService.authenticate(login, passwd);
+    User user = authenticationService.authenticate(login, passwd);
     return (null != user);
   }
 
@@ -194,19 +205,18 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
 
   /**
    * Dump the database contents.
-   *
    * @return a XML stream containing the dump of the database
    * @throws IOException
    */
   public byte[] dumpXml() throws IOException {
-    Configuration config = snipsnap.api.app.Application.get().getConfiguration();
+    Configuration config = Application.get().getConfiguration();
     ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
     XMLSnipExport.store(exportStream, space.getAll(), um.getAll(), null, null, config.getFilePath());
     return exportStream.toByteArray();
   }
 
   public byte[] dumpXml(String match) throws IOException {
-    snipsnap.api.config.Configuration config = snipsnap.api.app.Application.get().getConfiguration();
+    Configuration config = Application.get().getConfiguration();
     ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
     XMLSnipExport.store(exportStream, Arrays.asList(space.match(match)), null, null, null, config.getFilePath());
     return exportStream.toByteArray();
@@ -221,7 +231,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
     try {
       XMLSnipImport.load(importStream, flags);
     } catch (Exception e) {
-      System.err.println("SnipSnapHandler.restoreXml: unable to import snips: " + e);
+      System.err.println("SnipSnapHandler.restoreXml: unable to import snips: "+e);
       throw new IOException(e.getMessage());
     }
     return true;
@@ -229,7 +239,8 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
 
   public String install(String prefix, Hashtable appConfig) throws Exception {
     ConfigurationManager configManager = ConfigurationManager.getInstance();
-    String appOid = applicationManager.getApplication(prefix);
+    ApplicationManager appManager = (ApplicationManager) Components.getComponent(ApplicationManager.class);
+    String appOid = appManager.getApplication(prefix);
     Configuration config = configManager.getConfiguration(appOid);
 
     // only set new values if config does not exits
@@ -238,7 +249,7 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
       Iterator optionIt = appConfig.keySet().iterator();
       while (optionIt.hasNext()) {
         String option = (String) optionIt.next();
-        String value = (String) appConfig.get(option);
+        String value = (String)appConfig.get(option);
         config.set(option, value);
       }
       if (prefix != null && !"".equals(prefix)) {
@@ -251,15 +262,14 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
       return configManager.getConfiguration(appOid).getUrl(prefix);
     }
 
-    return "a configuration for '" + prefix + "' already exists, aborting.";
+    return "a configuration for '"+prefix+"' already exists, aborting.";
   }
 
   /**
    * Install a new instance with user name and password. Uses default configuration.
-   *
-   * @param prefix     the instance prefix
+   * @param prefix the instance prefix
    * @param adminLogin admin login name
-   * @param passwd     admin password
+   * @param passwd admin password
    */
   public String install(String prefix, String adminLogin, String passwd) throws Exception {
     Hashtable appConfig = new Hashtable();
@@ -272,13 +282,12 @@ public class SnipSnapHandler extends AuthXmlRpcHandler
    * Install a new instance with user name and password. Uses the configuration as
    * provided in the command line but overrides the admin user/password found in
    * that file.
-   *
-   * @param prefix     the instance prefix
+   * @param prefix the instance prefix
    * @param adminLogin admin login name
-   * @param passwd     admin password
+   * @param passwd admin password
    */
-  public String install(String prefix, String adminLogin, String passwd, Hashtable appConfig) throws Exception {
-    appConfig.put(snipsnap.api.config.Configuration.APP_ADMIN_LOGIN, adminLogin);
+  public String install(String prefix, String adminLogin, String passwd, Hashtable appConfig) throws Exception{
+    appConfig.put(Configuration.APP_ADMIN_LOGIN, adminLogin);
     appConfig.put(Configuration.APP_ADMIN_PASSWORD, passwd);
     return install(prefix, appConfig);
   }
blob - 157f755f1bc6f9b8ec4c1da4a5be751e902a9938
blob + 9464dc26d6ac23e8b85357f95f6833d41026ac64
--- src/snipsnap/api/snip/Snip.java
+++ src/snipsnap/api/snip/Snip.java
@@ -25,24 +25,28 @@
 
 package snipsnap.api.snip;
 
+import org.snipsnap.render.macro.list.Linkable;
+import org.snipsnap.render.macro.list.Nameable;
 import org.snipsnap.serialization.Appendable;
+import org.snipsnap.snip.Access;
+import org.snipsnap.snip.Comments;
+import org.snipsnap.snip.Modified;
+import org.snipsnap.snip.SnipPath;
+import org.snipsnap.snip.Links;
 import org.snipsnap.snip.attachment.Attachments;
-import snipsnap.api.label.Labels;
-import org.snipsnap.snip.*;
 import org.snipsnap.user.Permissions;
+import snipsnap.api.label.Labels;
 import snipsnap.api.user.User;
-import org.snipsnap.render.macro.list.Linkable;
-import org.snipsnap.render.macro.list.Nameable;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 import java.sql.Timestamp;
 import java.util.List;
-import java.io.IOException;
 
 /**
  * Interface for snips
  *
- * @author  Stephan J. Schmidt
+ * @author Stephan J. Schmidt
  * @version $Id: Snip.java 1706 2004-07-08 08:53:20Z stephan $
  */
 
blob - 0c38e8d60d0cc341b216e4ef68ca47c9a3a64100
blob + 5612f1216cf4960043bd4873f936a4b4fda948e3
--- src/snipsnap/api/snip/SnipSpaceFactory.java
+++ src/snipsnap/api/snip/SnipSpaceFactory.java
@@ -26,8 +26,6 @@
 package snipsnap.api.snip;
 
 import snipsnap.api.container.Components;
-import snipsnap.api.snip.*;
-import snipsnap.api.snip.SnipSpace;
 
 
 /**
@@ -38,8 +36,8 @@ import snipsnap.api.snip.SnipSpace;
  */
 
 public class SnipSpaceFactory {
-  public static synchronized snipsnap.api.snip.SnipSpace getInstance() {
-    return (SnipSpace) snipsnap.api.container.Components.getComponent(SnipSpace.class);
+  public static synchronized SnipSpace getInstance() {
+    return (SnipSpace) Components.getComponent(SnipSpace.class);
   }
 
   public static synchronized void removeInstance() {