1 25 26 package org.snipsnap.xmlrpc; 27 28 import org.apache.xmlrpc.XmlRpcException; 29 import org.snipsnap.app.Application; 30 import org.snipsnap.app.ApplicationManager; 31 import org.snipsnap.config.Configuration; 32 import org.snipsnap.config.ConfigurationManager; 33 import org.snipsnap.config.ConfigurationProxy; 34 import org.snipsnap.config.Globals; 35 import org.snipsnap.config.InitializeDatabase; 36 import org.snipsnap.container.Components; 37 import org.snipsnap.snip.XMLSnipExport; 38 import org.snipsnap.snip.XMLSnipImport; 39 import org.snipsnap.snip.SnipSpace; 40 import org.snipsnap.snip.Snip; 41 import org.snipsnap.snip.Links; 42 import org.snipsnap.snip.storage.SnipSerializer; 43 import org.snipsnap.user.AuthenticationService; 44 import org.snipsnap.user.User; 45 import org.snipsnap.user.UserManager; 46 import org.snipsnap.render.filter.links.BackLinks; 47 import org.dom4j.io.XMLWriter; 48 import org.dom4j.io.OutputFormat; 49 50 import java.io.ByteArrayInputStream ; 51 import java.io.ByteArrayOutputStream ; 52 import java.io.IOException ; 53 import java.io.OutputStreamWriter ; 54 import java.io.File ; 55 import java.util.Arrays ; 56 import java.util.Hashtable ; 57 import java.util.Iterator ; 58 import java.util.List ; 59 import java.util.Vector ; 60 61 67 68 public class SnipSnapHandler extends AuthXmlRpcHandler implements XmlRpcHandler { 69 private final static List FREE_METHODS = Arrays.asList(new String []{ 70 "getVersion", 71 "authenticateUser" 72 }); 73 74 private final static List PREFIX_METHODS = Arrays.asList(new String []{ 75 "getSnip", 76 "createSnip", 77 "removeSnip", 78 "getSnipAsXml", 79 "dumpXml", 80 "restoreXml", 81 "authenticateUser", 82 }); 83 84 public static final String API_PREFIX = "snipSnap"; 85 86 private SnipSpace space; 87 private AuthenticationService authenticationService; 88 private UserManager um; 89 private ApplicationManager applicationManager; 90 91 public SnipSnapHandler(AuthenticationService authenticationService, 92 SnipSpace space, 93 UserManager manager, 94 ApplicationManager applicationManager) { 95 this.authenticationService = authenticationService; 96 this.um = manager; 97 this.space = space; 98 this.applicationManager = applicationManager; 99 } 100 101 protected boolean authenticate(String username, String password) { 102 Globals globals = ConfigurationProxy.getInstance(); 103 if(password != null && password.equals(globals.getInstallKey())) { 104 return true; 105 } 106 107 User user = authenticationService.authenticate(username, password); 108 if (user != null && user.isAdmin()) { 109 Application.get().setUser(user); 110 return true; 111 } 112 System.err.println("XML-RPC authenticate: invalid login for " + username); 113 return false; 114 } 115 116 public Object execute(String method, Vector vector, String user, String password) throws Exception { 117 if(method.startsWith(API_PREFIX)) { 118 method = method.substring(API_PREFIX.length()+1); 119 } 120 121 if (PREFIX_METHODS.contains(method)) { 122 if(Application.get().getObject(Application.OID) == null || Application.get().getConfiguration() == null) { 123 if(!(vector.firstElement() instanceof String )) { 124 throw new Exception ("You need to specify a prefix (/) to select an instance."); 125 } 126 String prefix = (String ) vector.firstElement(); 127 String appOid = applicationManager.getApplication(prefix); 128 Configuration appConfig = ConfigurationManager.getInstance().getConfiguration(appOid); 129 if (appConfig != null) { 130 if(prefix.equals(vector.get(0))) { 131 vector.remove(0); 132 } 133 Application.get().setConfiguration(appConfig); 134 Application.get().storeObject(Application.OID, appOid); 135 } 136 } 137 } 138 139 if (FREE_METHODS.contains(method)) { 140 return super.execute(method, vector); 141 } else { 142 return super.execute(method, vector, user, password); 143 } 144 } 145 146 public String getName() { 147 return API_PREFIX; 148 } 149 150 public String getSnipAsXml(String name) { 151 Snip snip = space.load(name); 152 ByteArrayOutputStream out = new ByteArrayOutputStream (); 153 OutputFormat outputFormat = OutputFormat.createCompactFormat(); 154 outputFormat.setEncoding("UTF-8"); 155 try { 156 XMLWriter writer = new XMLWriter(out, outputFormat); 157 writer.write(SnipSerializer.getInstance().serialize(snip)); 158 writer.flush(); 159 } catch (IOException e) { 160 e.printStackTrace(); 161 } 162 return out.toString(); 163 } 164 165 public String getSnip(String name) { 166 Snip snip = space.load(name); 167 return snip.getContent(); 168 } 169 170 public String createSnip(String name, String content) { 171 Snip snip = space.create(name, content); 172 return name; 173 } 174 175 public String removeSnip(String name) { 176 Snip snip = space.load(name); 177 space.remove(snip); 178 return name; 179 } 180 181 186 public String getVersion() { 187 Globals globals = ConfigurationProxy.getInstance(); 188 return globals.getVersion(); 189 } 190 191 200 public boolean authenticateUser(String login, String passwd) throws XmlRpcException { 201 User user = authenticationService.authenticate(login, passwd); 202 return (null != user); 203 } 204 205 207 212 public byte[] dumpXml() throws IOException { 213 Configuration config = Application.get().getConfiguration(); 214 ByteArrayOutputStream exportStream = new ByteArrayOutputStream (); 215 XMLSnipExport.store(exportStream, space.getAll(), um.getAll(), null, null, config.getFilePath()); 216 return exportStream.toByteArray(); 217 } 218 219 public byte[] dumpXml(String match) throws IOException { 220 Configuration config = Application.get().getConfiguration(); 221 ByteArrayOutputStream exportStream = new ByteArrayOutputStream (); 222 XMLSnipExport.store(exportStream, Arrays.asList(space.match(match)), null, null, null, config.getFilePath()); 223 return exportStream.toByteArray(); 224 } 225 226 public boolean restoreXml(byte[] xmlData) throws IOException { 227 return restoreXml(xmlData, XMLSnipImport.IMPORT_SNIPS | XMLSnipImport.IMPORT_USERS | XMLSnipImport.OVERWRITE); 228 } 229 230 public boolean restoreXml(byte[] xmlData, int flags) throws IOException { 231 ByteArrayInputStream importStream = new ByteArrayInputStream (xmlData); 232 try { 233 XMLSnipImport.load(importStream, flags); 234 } catch (Exception e) { 235 System.err.println("SnipSnapHandler.restoreXml: unable to import snips: "+e); 236 throw new IOException (e.getMessage()); 237 } 238 return true; 239 } 240 241 public String install(String prefix, Hashtable appConfig) throws Exception { 242 ConfigurationManager configManager = ConfigurationManager.getInstance(); 243 ApplicationManager appManager = (ApplicationManager) Components.getComponent(ApplicationManager.class); 244 String appOid = appManager.getApplication(prefix); 245 Configuration config = configManager.getConfiguration(appOid); 246 247 if (null == config) { 249 config = ConfigurationProxy.newInstance(); 250 Iterator optionIt = appConfig.keySet().iterator(); 251 while (optionIt.hasNext()) { 252 String option = (String ) optionIt.next(); 253 String value = (String )appConfig.get(option); 254 config.set(option, value); 255 } 256 if (prefix != null && !"".equals(prefix)) { 257 if (!prefix.startsWith("/")) { 258 prefix = "/" + prefix; 259 } 260 config.setPrefix(prefix); 261 } 262 appOid = InitializeDatabase.init(config, new OutputStreamWriter (System.out)); 263 return configManager.getConfiguration(appOid).getUrl(prefix); 264 } 265 266 return "a configuration for '"+prefix+"' already exists, aborting."; 267 } 268 269 275 public String install(String prefix, String adminLogin, String passwd) throws Exception { 276 Hashtable appConfig = new Hashtable (); 277 appConfig.put(Configuration.APP_ADMIN_LOGIN, adminLogin); 278 appConfig.put(Configuration.APP_ADMIN_PASSWORD, passwd); 279 return install(prefix, appConfig); 280 } 281 282 290 public String install(String prefix, String adminLogin, String passwd, Hashtable appConfig) throws Exception { 291 appConfig.put(Configuration.APP_ADMIN_LOGIN, adminLogin); 292 appConfig.put(Configuration.APP_ADMIN_PASSWORD, passwd); 293 return install(prefix, appConfig); 294 } 295 296 } | Popular Tags |