allow subkeys, step 2
authorNiki Roo <niki@nikiroo.be>
Sat, 11 May 2019 17:07:42 +0000 (19:07 +0200)
committerNiki Roo <niki@nikiroo.be>
Sat, 11 May 2019 17:07:42 +0000 (19:07 +0200)
src/be/nikiroo/fanfix/library/RemoteLibrary.java
src/be/nikiroo/fanfix/library/RemoteLibraryServer.java

index e7b98282b422786eb95a077056a987039984cbfd..6e3380b4a2239a074c26750436f8abc0df368e12 100644 (file)
@@ -81,12 +81,12 @@ public class RemoteLibrary extends BasicLibrary {
        public RemoteLibrary(String key, String host, int port) {
                int index = -1;
                if (key != null) {
-                       key.indexOf('|');
+                       index = key.indexOf('|');
                }
 
                if (index >= 0) {
-                       this.key = key.substring(index + 1);
-                       this.subkey = key.substring(0, index);
+                       this.key = key.substring(0, index);
+                       this.subkey = key.substring(index + 1);
                } else {
                        this.key = key;
                        this.subkey = "";
index f4075dd7bf5df4e9fb1d734bc8d47fdb95852b5e..1f288ab7ab3b920ca8ee6830f523295d40f0f4c1 100644 (file)
@@ -2,6 +2,7 @@ package be.nikiroo.fanfix.library;
 
 import java.io.IOException;
 import java.net.URL;
+import java.nio.file.AccessDeniedException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -130,6 +131,7 @@ public class RemoteLibraryServer extends ServerObject {
                                }
                                if ((subkey + "|").contains("|wl|")) {
                                        wl = false; // |wl| = bypass whitelist
+                                       whitelist = new ArrayList<String>();
                                }
                        }
                }
@@ -188,11 +190,11 @@ public class RemoteLibraryServer extends ServerObject {
                if ("PING".equals(command)) {
                        return rw ? "r/w" : "r/o";
                } else if ("GET_METADATA".equals(command)) {
+                       List<MetaData> metas = new ArrayList<MetaData>();
+
                        if ("*".equals(args[0])) {
                                Progress pg = createPgForwarder(action);
 
-                               List<MetaData> metas = new ArrayList<MetaData>();
-
                                for (MetaData meta : Instance.getLibrary().getMetas(pg)) {
                                        MetaData light;
                                        if (meta.getCover() == null) {
@@ -206,13 +208,32 @@ public class RemoteLibraryServer extends ServerObject {
                                }
 
                                forcePgDoneSent(pg);
-                               return metas.toArray(new MetaData[] {});
+                       } else {
+                               metas.add(Instance.getLibrary().getInfo((String) args[0]));
+                       }
+
+                       if (!whitelist.isEmpty()) {
+                               for (int i = 0; i < metas.size(); i++) {
+                                       if (!whitelist.contains(metas.get(i).getSource())) {
+                                               metas.remove(i);
+                                               i--;
+                                       }
+                               }
                        }
 
-                       return new MetaData[] { Instance.getLibrary().getInfo(
-                                       (String) args[0]) };
+                       return metas.toArray(new MetaData[0]);
                } else if ("GET_STORY".equals(command)) {
                        MetaData meta = Instance.getLibrary().getInfo((String) args[0]);
+                       if (meta == null) {
+                               return null;
+                       }
+
+                       if (!whitelist.isEmpty()) {
+                               if (!whitelist.contains(meta.getSource())) {
+                                       return null;
+                               }
+                       }
+
                        meta = meta.clone();
                        meta.setCover(null);
 
@@ -226,6 +247,11 @@ public class RemoteLibraryServer extends ServerObject {
                                action.rec();
                        }
                } else if ("SAVE_STORY".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("" + args[0], null,
+                                               "Read-Only remote library");
+                       }
+
                        List<Object> list = new ArrayList<Object>();
 
                        action.send(null);
@@ -240,12 +266,22 @@ public class RemoteLibraryServer extends ServerObject {
                        Instance.getLibrary().save(story, (String) args[0], null);
                        return story.getMeta().getLuid();
                } else if ("IMPORT".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("" + args[0], null,
+                                               "Read-Only remote library");
+                       }
+
                        Progress pg = createPgForwarder(action);
                        Story story = Instance.getLibrary().imprt(
                                        new URL((String) args[0]), pg);
                        forcePgDoneSent(pg);
                        return story.getMeta().getLuid();
                } else if ("DELETE_STORY".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("" + args[0], null,
+                                               "Read-Only remote library");
+                       }
+
                        Instance.getLibrary().delete((String) args[0]);
                } else if ("GET_COVER".equals(command)) {
                        return Instance.getLibrary().getCover((String) args[0]);
@@ -260,6 +296,11 @@ public class RemoteLibraryServer extends ServerObject {
                                return null;
                        }
                } else if ("SET_COVER".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("" + args[0], "" + args[1],
+                                               "Read-Only remote library");
+                       }
+
                        if ("SOURCE".equals(args[0])) {
                                Instance.getLibrary().setSourceCover((String) args[1],
                                                (String) args[2]);
@@ -268,11 +309,21 @@ public class RemoteLibraryServer extends ServerObject {
                                                (String) args[2]);
                        }
                } else if ("CHANGE_STA".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("" + args[0], "" + args[1],
+                                               "Read-Only remote library");
+                       }
+
                        Progress pg = createPgForwarder(action);
                        Instance.getLibrary().changeSTA((String) args[0], (String) args[1],
                                        (String) args[2], (String) args[3], pg);
                        forcePgDoneSent(pg);
                } else if ("EXIT".equals(command)) {
+                       if (!rw) {
+                               throw new AccessDeniedException("EXIT", "",
+                                               "Read-Only remote library, cannot close it");
+                       }
+
                        stop(0, false);
                }