ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=1c14989ccda81ed8311dbfc4bb04b801a0dbdaec

commit 1c14989ccda81ed8311dbfc4bb04b801a0dbdaec
Author: Andy Williams <[email protected]>
Date:   Thu Sep 21 20:26:56 2017 +0100

    create: Escape single quotes in project and user name
    
    @fix T6044
---
 src/lib/edi_create.c        | 42 +++++++++++++++++++++++++++++++++++++-----
 src/lib/edi_private.h       |  1 +
 src/tests/Makefile.am       |  1 +
 src/tests/edi_suite.c       |  1 +
 src/tests/edi_suite.h       |  1 +
 src/tests/edi_test_create.c | 38 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c
index 0abfa75..a293a8f 100644
--- a/src/lib/edi_create.c
+++ b/src/lib/edi_create.c
@@ -73,29 +73,61 @@ _edi_create_year_get()
    return tp->tm_year + 1900;
 }
 
+char *
+edi_create_escape_quotes(const char *in)
+{
+   char buf[1024], *out_ptr;
+   const char *pos, *in_ptr;
+   int replace_len;
+
+   pos = strstr(in, "'");
+   if (!pos)
+     return strdup(in);
+
+   in_ptr = in;
+   out_ptr = buf;
+   while (pos)
+     {
+        replace_len = pos - in_ptr;
+        snprintf(out_ptr, replace_len + 1, "%s", in_ptr);
+        snprintf(out_ptr + replace_len, 8, "'\\\"'\\\"'");
+
+       in_ptr += replace_len + 1;
+       out_ptr += replace_len + 7;
+        pos = strstr(in_ptr, "'");
+     }
+   snprintf(out_ptr, strlen(in) - (in_ptr - in) + 1, "%s", in_ptr);
+
+   return strdup(buf);
+}
+
 static void
 _edi_create_filter_file(Edi_Create *create, const char *path)
 {
-   char *cmd, *lowername, *uppername;
+   char *cmd, *name, *lowername, *uppername, *user;
    const char *template;
    int length;
 
+   name = edi_create_escape_quotes(create->name);
+   user = edi_create_escape_quotes(create->user);
    create->filters++;
 // TODO speed this up - pre-cache this filter!
    template = "sh -c \"sed -i.bak 
's|\\${edi_name}|%s|g;s|\\${Edi_Name}|%s|g;s|\\${EDI_NAME}|%s|g;s|\\${Edi_User}|%s|g;s|\\${Edi_Email}|%s|g;s|\\${Edi_Url}|%s|g;s|\\${Edi_Year}|%d|g'
 %s\"; rm %s.bak";
-   length = strlen(template) + (strlen(create->name) * 3)  + 
strlen(create->user) + strlen(create->email) + strlen(create->url) + 
(strlen(path) * 2) + 4 - 16 + 1;
+   length = strlen(template) + (strlen(name) * 3)  + strlen(user) + 
strlen(create->email) + strlen(create->url) + (strlen(path) * 2) + 4 - 16 + 1;
 
-   lowername = strdup(create->name);
+   lowername = strdup(name);
    eina_str_tolower(&lowername);
-   uppername = strdup(create->name);
+   uppername = strdup(name);
    eina_str_toupper(&uppername);
 
    cmd = malloc(sizeof(char) * length);
-   snprintf(cmd, length, template, lowername, create->name, uppername , 
create->user, create->email, create->url, _edi_create_year_get(), path, path);
+   snprintf(cmd, length, template, lowername, name, uppername , user, 
create->email, create->url, _edi_create_year_get(), path, path);
 
    ecore_exe_run(cmd, NULL);
    free(lowername);
    free(uppername);
+   free(name);
+   free(user);
    free(cmd);
 
    // This matches the filtered path copy created in the copy callback
diff --git a/src/lib/edi_private.h b/src/lib/edi_private.h
index a7824ed..ac3bd48 100644
--- a/src/lib/edi_private.h
+++ b/src/lib/edi_private.h
@@ -2,6 +2,7 @@
 # define EDI_PRIVATE_H
 
 extern int _edi_lib_log_dom;
+char *edi_create_escape_quotes(const char *in);
 
 #ifdef ERR
 # undef ERR
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index 23aefb8..2ff571b 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -9,6 +9,7 @@ clang_include = '$(CLANG_INCLUDE)'
 
 edi_suite_SOURCES = \
 edi_test_path.c \
+edi_test_create.c \
 edi_test_exe.c \
 edi_test_content_provider.c \
 edi_test_language_provider.c \
diff --git a/src/tests/edi_suite.c b/src/tests/edi_suite.c
index 118f590..b0f1087 100644
--- a/src/tests/edi_suite.c
+++ b/src/tests/edi_suite.c
@@ -15,6 +15,7 @@ static const struct {
 } tests[] = {
   { "basic", edi_test_basic },
   { "path", edi_test_path },
+  { "create", edi_test_create },
   { "exe", edi_test_exe },
   { "content_provider", edi_test_content_provider },
   { "language_provider", edi_test_language_provider },
diff --git a/src/tests/edi_suite.h b/src/tests/edi_suite.h
index 3b235d7..d8d3e69 100644
--- a/src/tests/edi_suite.h
+++ b/src/tests/edi_suite.h
@@ -8,6 +8,7 @@
 void edi_test_basic(TCase *tc);
 void edi_test_console(TCase *tc);
 void edi_test_path(TCase *tc);
+void edi_test_create(TCase *tc);
 void edi_test_exe(TCase *tc);
 void edi_test_content_provider(TCase *tc);
 void edi_test_language_provider(TCase *tc);
diff --git a/src/tests/edi_test_create.c b/src/tests/edi_test_create.c
new file mode 100644
index 0000000..c9f86f4
--- /dev/null
+++ b/src/tests/edi_test_create.c
@@ -0,0 +1,38 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "edi_suite.h"
+
+#include "edi_create.c"
+
+START_TEST (edi_test_create_escape_quotes)
+{
+   const char *in = "hallowe'en";
+
+   char *out = edi_create_escape_quotes(in);
+
+   ck_assert_str_eq(out, "hallowe'\\\"'\\\"'en");
+
+   free(out);
+}
+END_TEST
+
+START_TEST (edi_test_create_escape_multiple_quotes)
+{
+   const char *in = "we'ven't";
+
+   char *out = edi_create_escape_quotes(in);
+
+   ck_assert_str_eq(out, "we'\\\"'\\\"'ven'\\\"'\\\"'t");
+
+   free(out);
+}
+END_TEST
+
+void edi_test_create(TCase *tc)
+{
+   tcase_add_test(tc, edi_test_create_escape_quotes);
+   tcase_add_test(tc, edi_test_create_escape_multiple_quotes);
+}
+

-- 


Reply via email to