From fb25273cf02653ac343d5437083b1bc41af5ce23 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Fri, 10 May 2019 19:19:02 +0200 Subject: [PATCH] allox subkeys, step 1 (keys not active) --- libs/nikiroo-utils-4.7.2-dev-sources.jar | Bin 320535 -> 326061 bytes src/be/nikiroo/fanfix/Instance.java | 4 +- src/be/nikiroo/fanfix/Main.java | 26 +++-- src/be/nikiroo/fanfix/bundles/Config.java | 13 ++- .../nikiroo/fanfix/bundles/config.properties | 15 +++ .../fanfix/bundles/resources_core.properties | 4 +- .../bundles/resources_core_fr.properties | 4 +- .../nikiroo/fanfix/library/RemoteLibrary.java | 107 +++++++++++++----- .../fanfix/library/RemoteLibraryServer.java | 93 ++++++++++++--- src/be/nikiroo/fanfix/package-info.java | 2 +- 10 files changed, 209 insertions(+), 59 deletions(-) diff --git a/libs/nikiroo-utils-4.7.2-dev-sources.jar b/libs/nikiroo-utils-4.7.2-dev-sources.jar index c4f532dfe98705c805819c33f9d373d787aad704..180d3871ed71b53e6217cfd007b9b1bc92145852 100644 GIT binary patch delta 42601 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 U++j9F$-&=#%*c1o!Gn~40Yv^1CIA2c diff --git a/src/be/nikiroo/fanfix/Instance.java b/src/be/nikiroo/fanfix/Instance.java index b6849c27..ef7799fb 100644 --- a/src/be/nikiroo/fanfix/Instance.java +++ b/src/be/nikiroo/fanfix/Instance.java @@ -441,6 +441,7 @@ public class Instance { + getFile(libDir), e)); } } else { + Exception ex = null; int pos = remoteLib.lastIndexOf(":"); if (pos >= 0) { String port = remoteLib.substring(pos + 1).trim(); @@ -459,13 +460,14 @@ public class Instance { lib); } catch (Exception e) { + ex = e; } } } if (lib == null) { tracer.error(new IOException( - "Cannot create remote library for: " + remoteLib)); + "Cannot create remote library for: " + remoteLib, ex)); } } diff --git a/src/be/nikiroo/fanfix/Main.java b/src/be/nikiroo/fanfix/Main.java index 995251d1..f8c0ca25 100644 --- a/src/be/nikiroo/fanfix/Main.java +++ b/src/be/nikiroo/fanfix/Main.java @@ -7,6 +7,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import be.nikiroo.fanfix.bundles.Config; import be.nikiroo.fanfix.bundles.StringId; import be.nikiroo.fanfix.data.Chapter; import be.nikiroo.fanfix.data.MetaData; @@ -76,9 +77,8 @@ public class Main { *
  • --set-reader [reader type]: set the reader type to CLI, TUI or LOCAL * for this command
  • *
  • --version: get the version of the program
  • - *
  • --server [key] [port]: start a server on this port
  • - *
  • --stop-server [key] [port]: stop the running server on this port if - * any
  • + *
  • --server: start the server mode (see config file for parameters)
  • + *
  • --stop-server: stop the running server on this port if any
  • *
  • --remote [key] [host] [port]: use a the given remote library
  • * * @@ -326,14 +326,10 @@ public class Main { exitCode = 255; // no arguments for this option break; case SERVER: + exitCode = 255; // no arguments for this option + break; case STOP_SERVER: - if (key == null) { - key = args[i]; - } else if (port == null) { - port = Integer.parseInt(args[i]); - } else { - exitCode = 255; - } + exitCode = 255; // no arguments for this option break; case REMOTE: if (key == null) { @@ -571,8 +567,11 @@ public class Main { BasicReader.getReader().browse(null); break; case SERVER: + key = Instance.getConfig().getString(Config.SERVER_KEY); + port = Instance.getConfig().getInteger(Config.SERVER_PORT); if (port == null) { - exitCode = 255; + System.err.println("No port configured in the config file"); + exitCode = 15; break; } try { @@ -584,8 +583,11 @@ public class Main { } return; case STOP_SERVER: + key = Instance.getConfig().getString(Config.SERVER_KEY); + port = Instance.getConfig().getInteger(Config.SERVER_PORT); if (port == null) { - exitCode = 255; + System.err.println("No port configured in the config file"); + exitCode = 15; break; } diff --git a/src/be/nikiroo/fanfix/bundles/Config.java b/src/be/nikiroo/fanfix/bundles/Config.java index 74beeaec..35f63d6d 100644 --- a/src/be/nikiroo/fanfix/bundles/Config.java +++ b/src/be/nikiroo/fanfix/bundles/Config.java @@ -32,6 +32,16 @@ public enum Config { DEFAULT_COVERS_DIR, // @Meta(description = "string", info = "The default library to use (KEY:SERVER:PORT), or empty for the local library") DEFAULT_LIBRARY, // + @Meta(def = "58365", description = "The port on which we can start the server", format = Format.INT, info = "A valid port") + SERVER_PORT, // + @Meta(def = "", description = "The encryption key for the server (NOT including a subkey)", format = Format.PASSWORD, info = "cannot contain the pipe character (|)") + SERVER_KEY, // + @Meta(def = "TRUE", description = "Allow write access to the clients by default (download story, move story...)", format = Format.BOOLEAN) + SERVER_RW, // + @Meta(def = "", description = "If not empty, only the EXACT listed sources will be available for clients", info = "list is comma-separated (,) and values are surrounded by double quotes (\"); any double quote in the value must be backslash-escaped (with \\\")") + SERVER_WHITELIST, // + @Meta(def = "", description = "The subkeys that the server will allow, including the modes", info = "list is comma-separated (,) and values are surrounded by double quotes (\"); any double quote in the value must be backslash-escaped (with \\\")") + SERVER_ALLOWED_SUBKEYS, // @Meta(def = "$HOME/Books", description = "absolute path, $HOME variable supported, / is always accepted as dir separator", format = Format.DIRECTORY, info = "The directory where to store the library") LIBRARY_DIR, // @Meta(def = "false", description = "boolean", format = Format.BOOLEAN, info = "Show debug information on errors") @@ -65,8 +75,7 @@ public enum Config { @Meta(description = "If the last update check was done at least that many days, check for updates at startup (-1 for 'no checks' -- default is 1 day)", format = Format.INT) UPDATE_INTERVAL, // @Meta(def = "", description = "", info = "Format is ((user(:pass)@)proxy:port), with ':' being system proxy and an empty String being no proxy") - USE_PROXY, - @Meta(description = "An API key required to create a token from FimFiction", format = Format.STRING) + USE_PROXY, @Meta(description = "An API key required to create a token from FimFiction", format = Format.STRING) LOGIN_FIMFICTION_APIKEY_CLIENT_ID, // @Meta(description = "An API key required to create a token from FimFiction", format = Format.PASSWORD) LOGIN_FIMFICTION_APIKEY_CLIENT_SECRET, // diff --git a/src/be/nikiroo/fanfix/bundles/config.properties b/src/be/nikiroo/fanfix/bundles/config.properties index 64095397..63b7642a 100644 --- a/src/be/nikiroo/fanfix/bundles/config.properties +++ b/src/be/nikiroo/fanfix/bundles/config.properties @@ -33,6 +33,21 @@ USER_AGENT = Mozilla/5.0 (X11; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44. DEFAULT_COVERS_DIR = $HOME/.fanfix/covers/ # string (FORMAT: STRING) The default library to use (KEY:SERVER:PORT), or empty for the local library DEFAULT_LIBRARY = +# The port on which we can start the server +# (FORMAT: INT) A valid port +SERVER_PORT = 58365 +# The encryption key for the server (NOT including a subkey) +# (FORMAT: PASSWORD) cannot contain the pipe character (|) +SERVER_KEY = +# Allow write access to the clients by default (download story, move story...) +# (FORMAT: BOOLEAN) +SERVER_RW = +# If not empty, only the EXACT listed sources will be available for clients +# (FORMAT: STRING) list is comma-separated (,) and values are surrounded by double quotes ("); any double quote in the value must be backslash-escaped (with \") +SERVER_WHITELIST = +# The subkeys that the server will allow, including the modes +# (FORMAT: STRING) list is comma-separated (,) and values are surrounded by double quotes ("); any double quote in the value must be backslash-escaped (with \") +SERVER_ALLOWED_SUBKEYS = # absolute path, $HOME variable supported, / is always accepted as dir separator # (FORMAT: DIRECTORY) The directory where to store the library LIBRARY_DIR = $HOME/Books diff --git a/src/be/nikiroo/fanfix/bundles/resources_core.properties b/src/be/nikiroo/fanfix/bundles/resources_core.properties index 363a59b2..1ebc3d59 100644 --- a/src/be/nikiroo/fanfix/bundles/resources_core.properties +++ b/src/be/nikiroo/fanfix/bundles/resources_core.properties @@ -34,8 +34,8 @@ HELP_SYNTAX = Valid options:\n\ \t--set-author [id] [new author]: change the author of the given story\n\ \t--set-reader [reader type]: set the reader type to CLI, TUI or GUI for \n\ \t\tthis command\n\ -\t--server [key] [port]: start a remote server on this port\n\ -\t--stop-server [key] [port]: stop the remote server running on this port\n\ +\t--server: start the server mode (see config file for parameters)\n\ +\t--stop-server: stop the remote server running on this port\n\ \t\tif any (key must be set to the same value)\n\ \t--remote [key] [host] [port]: select this remote server to get \n\ \t\t(or update or...) the stories from (key must be set to the \n\ diff --git a/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties b/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties index 1ce9f64f..e64651b3 100644 --- a/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties +++ b/src/be/nikiroo/fanfix/bundles/resources_core_fr.properties @@ -28,8 +28,8 @@ HELP_SYNTAX = Options reconnues :\n\ \t--set-title [id] [nouveau titre]: change le titre de l'histoire\n\ \t--set-author [id] [nouvel auteur]: change l'auteur de l'histoire\n\ \t--set-reader [reader type]: changer le type de lecteur pour la commande en cours sur CLI, TUI ou GUI\n\ -\t--server [key] [port]: démarrer un serveur d'histoires sur ce port\n\ -\t--stop-server [key] [port]: arrêter le serveur distant sur ce port (key doit avoir la même valeur) \n\ +\t--server: démarre le mode serveur (les paramètres sont dans le fichier de config)\n\ +\t--stop-server: arrêter le serveur distant sur ce port (key doit avoir la même valeur) \n\ \t--remote [key] [host] [port]: contacter ce server au lieu de la librairie habituelle (key doit avoir la même valeur)\n\ \t--help: afficher la liste des options disponibles\n\ \t--version: retourne la version du programme\n\ diff --git a/src/be/nikiroo/fanfix/library/RemoteLibrary.java b/src/be/nikiroo/fanfix/library/RemoteLibrary.java index e35c57d1..e7b98282 100644 --- a/src/be/nikiroo/fanfix/library/RemoteLibrary.java +++ b/src/be/nikiroo/fanfix/library/RemoteLibrary.java @@ -14,6 +14,7 @@ import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.utils.Image; import be.nikiroo.utils.Progress; +import be.nikiroo.utils.Version; import be.nikiroo.utils.serial.server.ConnectActionClientObject; /** @@ -27,11 +28,47 @@ public class RemoteLibrary extends BasicLibrary { private String host; private int port; private final String key; + private final String subkey; + + // informative only (server will make the actual checks) + private boolean rw; // TODO: error handling is not up to par! /** * Create a {@link RemoteLibrary} linked to the given server. + *

    + * Note that the key is structured: + * xxx(|yyy|wl)(|rw) + *

    + * Note that anything before the first pipe (|) character is + * considered to be the encryption key, anything after that character is + * called the subkey (including the other pipe characters and flags!). + *

    + * This is important because the subkey (including the pipe characters and + * flags) must be present as-is in the server configuration file to be + * allowed. + *

      + *
    • xxx: the encryption key used to communicate with the + * server
    • + *
    • yyy: the secondary key
    • + *
    • rw: flag to allow read and write access if it is not the + * default on this server
    • + *
    • wl: flag to allow access to all the stories (bypassing the + * whitelist if it exists)
    • + *
    + * + * Some examples: + *
      + *
    • my_key: normal connection, will take the default server + * options
    • + *
    • my_key|agzyzz|wl: will ask to bypass the white list (if it + * exists)
    • + *
    • my_key|agzyzz|rw: will ask read-write access (if the default + * is read-only)
    • + *
    • my_key|agzyzz|wl|rw: will ask both read-write access and white + * list bypass
    • + *
    * * @param key * the key that will allow us to exchange information with the @@ -42,7 +79,19 @@ public class RemoteLibrary extends BasicLibrary { * the port to contact it on */ public RemoteLibrary(String key, String host, int port) { - this.key = key; + int index = -1; + if (key != null) { + key.indexOf('|'); + } + + if (index >= 0) { + this.key = key.substring(index + 1); + this.subkey = key.substring(0, index); + } else { + this.key = key; + this.subkey = ""; + } + this.host = host; this.port = port; } @@ -78,10 +127,14 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - Object rep = send(new Object[] { "PING" }); + public void action(Version serverVersion) throws Exception { + Object rep = send(new Object[] { subkey, "PING" }); - if ("PONG".equals(rep)) { + if ("r/w".equals(rep)) { + rw = true; + result[0] = Status.READY; + } else if ("r/o".equals(rep)) { + rw = false; result[0] = Status.READY; } else { result[0] = Status.UNAUTHORIZED; @@ -119,8 +172,8 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - Object rep = send(new Object[] { "GET_COVER", luid }); + public void action(Version serverVersion) throws Exception { + Object rep = send(new Object[] { subkey, "GET_COVER", luid }); result[0] = (Image) rep; } @@ -170,9 +223,9 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - Object rep = send(new Object[] { "GET_CUSTOM_COVER", type, - source }); + public void action(Version serverVersion) throws Exception { + Object rep = send(new Object[] { subkey, + "GET_CUSTOM_COVER", type, source }); result[0] = (Image) rep; } @@ -205,13 +258,13 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { + public void action(Version serverVersion) throws Exception { Progress pg = pgF; if (pg == null) { pg = new Progress(); } - Object rep = send(new Object[] { "GET_STORY", luid }); + Object rep = send(new Object[] { subkey, "GET_STORY", luid }); MetaData meta = null; if (rep instanceof MetaData) { @@ -270,13 +323,13 @@ public class RemoteLibrary extends BasicLibrary { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { + public void action(Version serverVersion) throws Exception { Progress pg = pgF; if (story.getMeta().getWords() <= Integer.MAX_VALUE) { pg.setMinMax(0, (int) story.getMeta().getWords()); } - send(new Object[] { "SAVE_STORY", luid }); + send(new Object[] { subkey, "SAVE_STORY", luid }); List list = RemoteLibraryServer.breakStory(story); for (Object obj : list) { @@ -324,8 +377,8 @@ public class RemoteLibrary extends BasicLibrary { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - send(new Object[] { "DELETE_STORY", luid }); + public void action(Version serverVersion) throws Exception { + send(new Object[] { subkey, "DELETE_STORY", luid }); } @Override @@ -368,8 +421,8 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - send(new Object[] { "SET_COVER", type, value, luid }); + public void action(Version serverVersion) throws Exception { + send(new Object[] { subkey, "SET_COVER", type, value, luid }); } @Override @@ -417,10 +470,11 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { + public void action(Version serverVersion) throws Exception { Progress pg = pgF; - Object rep = send(new Object[] { "IMPORT", url.toString() }); + Object rep = send(new Object[] { subkey, "IMPORT", + url.toString() }); while (true) { if (!RemoteLibraryServer.updateProgress(pg, rep)) { @@ -473,11 +527,11 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { + public void action(Version serverVersion) throws Exception { Progress pg = pgF; - Object rep = send(new Object[] { "CHANGE_STA", luid, - newSource, newTitle, newAuthor }); + Object rep = send(new Object[] { subkey, "CHANGE_STA", + luid, newSource, newTitle, newAuthor }); while (true) { if (!RemoteLibraryServer.updateProgress(pg, rep)) { break; @@ -519,8 +573,8 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { - send(new Object[] { "EXIT" }); + public void action(Version serverVersion) throws Exception { + send(new Object[] { subkey, "EXIT" }); } @Override @@ -611,13 +665,14 @@ public class RemoteLibrary extends BasicLibrary { try { new ConnectActionClientObject(host, port, key) { @Override - public void action() throws Exception { + public void action(Version serverVersion) throws Exception { Progress pg = pgF; if (pg == null) { pg = new Progress(); } - Object rep = send(new Object[] { "GET_METADATA", luid }); + Object rep = send(new Object[] { subkey, "GET_METADATA", + luid }); while (true) { if (!RemoteLibraryServer.updateProgress(pg, rep)) { diff --git a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java index 62548d67..f4075dd7 100644 --- a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java +++ b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java @@ -11,6 +11,7 @@ import java.util.Map; import javax.net.ssl.SSLException; import be.nikiroo.fanfix.Instance; +import be.nikiroo.fanfix.bundles.Config; import be.nikiroo.fanfix.data.Chapter; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Paragraph; @@ -18,6 +19,7 @@ import be.nikiroo.fanfix.data.Story; import be.nikiroo.utils.Progress; import be.nikiroo.utils.Progress.ProgressListener; import be.nikiroo.utils.StringUtils; +import be.nikiroo.utils.Version; import be.nikiroo.utils.serial.server.ConnectActionServerObject; import be.nikiroo.utils.serial.server.ServerObject; @@ -27,8 +29,12 @@ import be.nikiroo.utils.serial.server.ServerObject; * The available commands are given as arrays of objects (first item is the * command, the rest are the arguments). *

    + * All the commands are always prefixed by the subkey (which can be EMPTY if + * none). + *

    *

      - *
    • PING: will return PONG if the key is accepted
    • + *
    • PING: will return the mode if the key is accepted (mode can be: "r/o" or + * "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
    • @@ -54,10 +60,15 @@ import be.nikiroo.utils.serial.server.ServerObject; public class RemoteLibraryServer extends ServerObject { private Map commands = new HashMap(); private Map times = new HashMap(); + private Map wls = new HashMap(); + private Map rws = new HashMap(); /** * Create a new remote server (will not be active until * {@link RemoteLibraryServer#start()} is called). + *

      + * 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 @@ -73,53 +84,109 @@ public class RemoteLibraryServer extends ServerObject { } @Override - protected Object onRequest(ConnectActionServerObject action, Object data, - long id) throws Exception { + protected Object onRequest(ConnectActionServerObject action, + Version clientVersion, Object data, long id) throws Exception { long start = new Date().getTime(); + // defaults are positive (as previous versions without the feature) + boolean rw = true; + boolean wl = true; + + String subkey = ""; String command = ""; Object[] args = new Object[0]; if (data instanceof Object[]) { Object[] dataArray = (Object[]) data; if (dataArray.length > 0) { - command = "" + dataArray[0]; + subkey = "" + dataArray[0]; + } + if (dataArray.length > 1) { + command = "" + dataArray[1]; + + args = new Object[dataArray.length - 2]; + for (int i = 2; i < dataArray.length; i++) { + args[i - 2] = dataArray[i]; + } + } + } + + List whitelist = Instance.getConfig().getList( + Config.SERVER_WHITELIST); + if (whitelist == null) { + whitelist = new ArrayList(); + } + + if (whitelist.isEmpty()) { + wl = false; + } - args = new Object[dataArray.length - 1]; - for (int i = 1; i < dataArray.length; i++) { - args[i - 1] = dataArray[i]; + rw = Instance.getConfig().getBoolean(Config.SERVER_RW, rw); + if (!subkey.isEmpty()) { + List allowed = Instance.getConfig().getList( + Config.SERVER_ALLOWED_SUBKEYS); + if (allowed.contains(subkey)) { + if ((subkey + "|").contains("|rw|")) { + rw = true; + } + if ((subkey + "|").contains("|wl|")) { + wl = false; // |wl| = bypass whitelist } } } - String trace = "[ " + command + "] "; + String mode = display(wl, rw); + + String trace = mode + "[ " + command + "] "; for (Object arg : args) { trace += arg + " "; } System.out.println(trace); - Object rep = doRequest(action, command, args); + Object rep = doRequest(action, command, args, rw, whitelist); commands.put(id, command); + wls.put(id, wl); + rws.put(id, rw); times.put(id, (new Date().getTime() - start)); return rep; } + private String display(boolean whitelist, boolean rw) { + String mode = ""; + if (!rw) { + mode += "RO: "; + } + if (whitelist) { + mode += "WL: "; + } + + return mode; + } + @Override protected void onRequestDone(long id, long bytesReceived, long bytesSent) { + boolean whitelist = wls.get(id); + boolean rw = rws.get(id); + wls.remove(id); + rws.remove(id); + String rec = StringUtils.formatNumber(bytesReceived) + "b"; String sent = StringUtils.formatNumber(bytesSent) + "b"; - System.out.println(String.format("[>%s]: (%s sent, %s rec) in %d ms", - commands.get(id), sent, rec, times.get(id))); + System.out.println(String.format("%s[>%s]: (%s sent, %s rec) in %d ms", + display(whitelist, rw), commands.get(id), sent, rec, + times.get(id))); + commands.remove(id); times.remove(id); } private Object doRequest(ConnectActionServerObject action, String command, - Object[] args) throws NoSuchFieldException, NoSuchMethodException, + Object[] args, boolean rw, List whitelist) + throws NoSuchFieldException, NoSuchMethodException, ClassNotFoundException, IOException { if ("PING".equals(command)) { - return "PONG"; + return rw ? "r/w" : "r/o"; } else if ("GET_METADATA".equals(command)) { if ("*".equals(args[0])) { Progress pg = createPgForwarder(action); diff --git a/src/be/nikiroo/fanfix/package-info.java b/src/be/nikiroo/fanfix/package-info.java index 6929cac7..cfd9cbef 100644 --- a/src/be/nikiroo/fanfix/package-info.java +++ b/src/be/nikiroo/fanfix/package-info.java @@ -4,7 +4,7 @@ * files that you can read anywhere. *

      * It has support for a {@link be.nikiroo.fanfix.library.BasicLibrary} system, - * too. + * too, and can even offer its services over the network. * * @author niki */ -- 2.27.0