From 105e1e3c0b8fdfc410bdfcafdff1bdccdcec314c Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sat, 30 Jan 2021 22:07:55 +0100
Subject: [PATCH] MPD: Add the 'config' command for authentificated users

---
 README.md             |  2 +-
 inc/lektor/commands.h |  1 +
 src/base/commands.c   | 18 ++++++++++++++++++
 src/net/listen.c      |  2 ++
 4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index cde27020..26b32091 100644
--- a/README.md
+++ b/README.md
@@ -255,7 +255,7 @@ For the compatibility column, the possible values are the following:
 | `kill`                                    | `kill`                                | +     |                                                 |
 | `password {password}`                     | `password {password}`                 | +     |                                                 |
 | `ping`                                    | `ping`                                | +     |                                                 |
-| `config`                                  |                                       |       | not implemented                                 |
+| `config`                                  | `config`                              | +     | all authentified client can do this command     |
 | `sticker get {t} {uri} {n}`               | `sticker get {type} {uri} {name}`     | CHECK | check the return conventions                    |
 | `sticker set {t} {uri} {n} {val}`         | `sticker set {t} {uri} {n} {val}`     | CHECK | check the return conventions                    |
 | `sticker delete {t} {uri} [n]`            | `sticker delete {t} {uri} [n]`        | CHECK | check the return conventions                    |
diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 65affefa..8c1da8c2 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -95,6 +95,7 @@ bool command_kill   (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARG
 bool command_import (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_update (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_rescan (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX], int forced);
+bool command_config (struct lkt_state *srv, size_t c, char UNUSED *argv[LKT_MESSAGE_ARGS_MAX]);
 
 /* Sticker management */
 bool command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
diff --git a/src/base/commands.c b/src/base/commands.c
index fd61a9dc..4b6d3aeb 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -92,6 +92,24 @@ command_kill(struct lkt_state *srv, size_t c, char UNUSED *argv[LKT_MESSAGE_ARGS
     LOG_FATAL("The SIGINT handler returned, now exiting");
 }
 
+bool
+command_config(struct lkt_state *srv, size_t c, char UNUSED *argv[LKT_MESSAGE_ARGS_MAX])
+{
+    RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
+    struct lkt_message *out;
+    out = lkt_message_new();
+    char db_file[LKT_LINE_MAX];
+    memset(db_file, 0, sizeof(db_file));
+    database_config_get(srv->db, "database", "db_path", db_file, LKT_LINE_MAX);
+    out->data_len = safe_snprintf(out->data, LKT_MESSAGE_MAX,
+                                  "max_clients: %ld\n"
+                                  "db_file: %s\n"
+                                  "music_directory: %s\n",
+                                  srv->fds_max, db_file, srv->kara_prefix);
+    lkt_state_send(srv, c, out);
+    return true;
+}
+
 bool
 command_currentsong(struct lkt_state *srv, size_t c, char UNUSED *args[LKT_MESSAGE_ARGS_MAX])
 {
diff --git a/src/net/listen.c b/src/net/listen.c
index c97aae32..883ad67f 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -169,6 +169,8 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             err = ! command_import(srv, c, cmd.args);
         else if (STR_MATCH(cmd.name, "__rescan"))
             err = ! command_rescan(srv, c, cmd.args, true);
+        else if (STR_MATCH(cmd.name, "config"))
+            err = ! command_config(srv, c, NULL);
 
         /* Commands that are available if not in idle mode */
         else if (STR_MATCH(cmd.name, "currentsong"))
-- 
GitLab