X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FRemoteLibraryServer.java;h=59819bb948903a1893b9e9d2751f43ca8d3a66a5;hb=0a264fbe3d5a43516006052574a5f322d9d38897;hp=0319439c05f012b630bbd422f900232f25a3caa7;hpb=95e522ea1a6d23e089e207ea67c1fc0296bf7389;p=nikiroo-utils.git
diff --git a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java
index 0319439..59819bb 100644
--- a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java
+++ b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java
@@ -2,8 +2,8 @@ package be.nikiroo.fanfix.library;
import java.io.IOException;
import java.net.URL;
-import java.rmi.AccessException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -38,7 +38,8 @@ import be.nikiroo.utils.serial.server.ServerObject;
* "r/w")
*
GET_METADATA *: will return the metadata of all the stories in the
* library (array) *
- * GET_METADATA [luid]: will return the metadata of the story of LUID luid
+ * GET_METADATA [luid]: will return the metadata of the story of LUID
+ * luid
* GET_STORY [luid]: will return the given story if it exists (or NULL if
* not)
* SAVE_STORY [luid]: save the story (that must be sent just after the
@@ -62,6 +63,7 @@ public class RemoteLibraryServer extends ServerObject {
private Map commands = new HashMap();
private Map times = new HashMap();
private Map wls = new HashMap();
+ private Map bls = new HashMap();
private Map rws = new HashMap();
/**
@@ -71,17 +73,17 @@ public class RemoteLibraryServer extends ServerObject {
* Note: the key we use here is the encryption key (it must not contain a
* subkey).
*
- * @param key
- * the key that will restrict access to this server
- * @param port
- * the port to listen on
- *
* @throws IOException
* in case of I/O error
*/
- public RemoteLibraryServer(String key, int port) throws IOException {
- super("Fanfix remote library", port, key);
- setTraceHandler(Instance.getTraceHandler());
+ public RemoteLibraryServer() throws IOException {
+ super("Fanfix remote library",
+ Instance.getInstance().getConfig()
+ .getInteger(Config.SERVER_PORT),
+ Instance.getInstance().getConfig()
+ .getString(Config.SERVER_KEY));
+
+ setTraceHandler(Instance.getInstance().getTraceHandler());
}
@Override
@@ -92,6 +94,7 @@ public class RemoteLibraryServer extends ServerObject {
// defaults are positive (as previous versions without the feature)
boolean rw = true;
boolean wl = true;
+ boolean bl = true;
String subkey = "";
String command = "";
@@ -111,20 +114,26 @@ public class RemoteLibraryServer extends ServerObject {
}
}
- List whitelist = Instance.getConfig().getList(
- Config.SERVER_WHITELIST);
+ List whitelist = Instance.getInstance().getConfig()
+ .getList(Config.SERVER_WHITELIST);
if (whitelist == null) {
whitelist = new ArrayList();
}
+ List blacklist = Instance.getInstance().getConfig()
+ .getList(Config.SERVER_BLACKLIST);
+ if (blacklist == null) {
+ blacklist = new ArrayList();
+ }
if (whitelist.isEmpty()) {
wl = false;
}
- rw = Instance.getConfig().getBoolean(Config.SERVER_RW, rw);
+ rw = Instance.getInstance().getConfig().getBoolean(Config.SERVER_RW,
+ rw);
if (!subkey.isEmpty()) {
- List allowed = Instance.getConfig().getList(
- Config.SERVER_ALLOWED_SUBKEYS);
+ List allowed = Instance.getInstance().getConfig()
+ .getList(Config.SERVER_ALLOWED_SUBKEYS);
if (allowed.contains(subkey)) {
if ((subkey + "|").contains("|rw|")) {
rw = true;
@@ -133,10 +142,14 @@ public class RemoteLibraryServer extends ServerObject {
wl = false; // |wl| = bypass whitelist
whitelist = new ArrayList();
}
+ if ((subkey + "|").contains("|bl|")) {
+ bl = false; // |bl| = bypass blacklist
+ blacklist = new ArrayList();
+ }
}
}
- String mode = display(wl, rw);
+ String mode = display(wl, bl, rw);
String trace = mode + "[ " + command + "] ";
for (Object arg : args) {
@@ -147,20 +160,21 @@ public class RemoteLibraryServer extends ServerObject {
Object rep = null;
try {
- rep = doRequest(action, command, args, rw, whitelist);
+ rep = doRequest(action, command, args, rw, whitelist, blacklist);
} catch (IOException e) {
- rep = new RemoteLibraryException(e);
+ rep = new RemoteLibraryException(e, true);
}
commands.put(id, command);
wls.put(id, wl);
+ bls.put(id, bl);
rws.put(id, rw);
times.put(id, (new Date().getTime() - start));
return rep;
}
- private String display(boolean whitelist, boolean rw) {
+ private String display(boolean whitelist, boolean blacklist, boolean rw) {
String mode = "";
if (!rw) {
mode += "RO: ";
@@ -168,6 +182,9 @@ public class RemoteLibraryServer extends ServerObject {
if (whitelist) {
mode += "WL: ";
}
+ if (blacklist) {
+ mode += "BL: ";
+ }
return mode;
}
@@ -175,27 +192,28 @@ public class RemoteLibraryServer extends ServerObject {
@Override
protected void onRequestDone(long id, long bytesReceived, long bytesSent) {
boolean whitelist = wls.get(id);
+ boolean blacklist = bls.get(id);
boolean rw = rws.get(id);
wls.remove(id);
+ bls.remove(id);
rws.remove(id);
String rec = StringUtils.formatNumber(bytesReceived) + "b";
String sent = StringUtils.formatNumber(bytesSent) + "b";
long now = System.currentTimeMillis();
- System.out.println(StringUtils.fromTime(now)
- + ": "
+ System.out.println(StringUtils.fromTime(now) + ": "
+ String.format("%s[>%s]: (%s sent, %s rec) in %d ms",
- display(whitelist, rw), commands.get(id), sent, rec,
- times.get(id)));
+ display(whitelist, blacklist, rw), commands.get(id),
+ sent, rec, times.get(id)));
commands.remove(id);
times.remove(id);
}
private Object doRequest(ConnectActionServerObject action, String command,
- Object[] args, boolean rw, List whitelist)
- throws NoSuchFieldException, NoSuchMethodException,
- ClassNotFoundException, IOException {
+ Object[] args, boolean rw, List whitelist,
+ List blacklist) throws NoSuchFieldException,
+ NoSuchMethodException, ClassNotFoundException, IOException {
if ("PING".equals(command)) {
return rw ? "r/w" : "r/o";
} else if ("GET_METADATA".equals(command)) {
@@ -204,21 +222,15 @@ public class RemoteLibraryServer extends ServerObject {
if ("*".equals(args[0])) {
Progress pg = createPgForwarder(action);
- for (MetaData meta : Instance.getLibrary().getMetas(pg)) {
- MetaData light;
- if (meta.getCover() == null) {
- light = meta;
- } else {
- light = meta.clone();
- light.setCover(null);
- }
-
- metas.add(light);
+ for (MetaData meta : Instance.getInstance().getLibrary()
+ .getMetas(pg)) {
+ metas.add(removeCover(meta));
}
forcePgDoneSent(pg);
} else {
- MetaData meta = Instance.getLibrary().getInfo((String) args[0]);
+ MetaData meta = Instance.getInstance().getLibrary()
+ .getInfo((String) args[0]);
MetaData light;
if (meta.getCover() == null) {
light = meta;
@@ -230,35 +242,29 @@ public class RemoteLibraryServer extends ServerObject {
metas.add(light);
}
- if (!whitelist.isEmpty()) {
- for (int i = 0; i < metas.size(); i++) {
- if (!whitelist.contains(metas.get(i).getSource())) {
- metas.remove(i);
- i--;
- }
+ for (int i = 0; i < metas.size(); i++) {
+ if (!isAllowed(metas.get(i), whitelist, blacklist)) {
+ metas.remove(i);
+ i--;
}
}
return metas.toArray(new MetaData[0]);
+
} else if ("GET_STORY".equals(command)) {
- MetaData meta = Instance.getLibrary().getInfo((String) args[0]);
- if (meta == null) {
+ MetaData meta = Instance.getInstance().getLibrary()
+ .getInfo((String) args[0]);
+ if (meta == null || !isAllowed(meta, whitelist, blacklist)) {
return null;
}
- if (!whitelist.isEmpty()) {
- if (!whitelist.contains(meta.getSource())) {
- return null;
- }
- }
-
meta = meta.clone();
meta.setCover(null);
action.send(meta);
action.rec();
- Story story = Instance.getLibrary()
+ Story story = Instance.getInstance().getLibrary()
.getStory((String) args[0], null);
for (Object obj : breakStory(story)) {
action.send(obj);
@@ -266,8 +272,8 @@ public class RemoteLibraryServer extends ServerObject {
}
} else if ("SAVE_STORY".equals(command)) {
if (!rw) {
- throw new AccessException("Read-Only remote library: "
- + args[0]);
+ throw new RemoteLibraryException(
+ "Read-Only remote library: " + args[0], false);
}
List