create: Escape single quotes in project and user name

@fix T6044
This commit is contained in:
Andy Williams 2017-09-21 20:26:56 +01:00
parent efb4793a10
commit 1c14989ccd
6 changed files with 79 additions and 5 deletions

View File

@ -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

View File

@ -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

View File

@ -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 \

View File

@ -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 },

View File

@ -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);

View File

@ -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);
}