Added support for gpg encrypted files
This commit is contained in:
parent
e6bba9f0ee
commit
88c9fbf7db
77
src/mdiary.c
77
src/mdiary.c
@ -217,13 +217,48 @@ static GList *mdiary_add_tags_from_string(gchar *string)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mdiary_add_file_to_store(gchar *filename, GtkListStore *entryListStore, GtkListStore *autoCompletion)
|
/**
|
||||||
|
* @brief mdiary_get_line_from_string WARNING: This does modify str and the content of str!
|
||||||
|
* @param str The pointer to the string where to search the linebreak
|
||||||
|
* @return The current line (null terminated). Do not free, this is a direct pointer into the original string.
|
||||||
|
*/
|
||||||
|
static gchar *mdiary_get_line_from_string(gchar **str_ptr)
|
||||||
|
{
|
||||||
|
gchar *start;
|
||||||
|
gchar *str;
|
||||||
|
|
||||||
|
if (!str_ptr || !*str_ptr | !**str_ptr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
str = *str_ptr;
|
||||||
|
start = str;
|
||||||
|
|
||||||
|
while (*str != '\n' && *str != '\0') {
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*str = '\0';
|
||||||
|
*str_ptr = ++str;
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief mdiary_add_file_to_store
|
||||||
|
* @param filename
|
||||||
|
* @param content NULL when the file shall be read by the function. Otherwise the file content.
|
||||||
|
* @param entryListStore
|
||||||
|
* @param autoCompletion
|
||||||
|
*/
|
||||||
|
static void mdiary_add_file_to_store(gchar *filename, gchar *content,
|
||||||
|
GtkListStore *entryListStore, GtkListStore *autoCompletion)
|
||||||
{
|
{
|
||||||
GFile *file;
|
GFile *file;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
GFileInputStream *stream;
|
GFileInputStream *stream;
|
||||||
GDataInputStream *dstream;
|
GDataInputStream *dstream;
|
||||||
gchar *line;
|
gchar *line;
|
||||||
|
gchar *content_ptr;
|
||||||
|
|
||||||
GDateTime *datetime = NULL;
|
GDateTime *datetime = NULL;
|
||||||
gchar *title = NULL;
|
gchar *title = NULL;
|
||||||
@ -234,6 +269,7 @@ static void mdiary_add_file_to_store(gchar *filename, GtkListStore *entryListSto
|
|||||||
|
|
||||||
g_message("Add file: %s\n", filename);
|
g_message("Add file: %s\n", filename);
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
file = g_file_new_for_path(filename);
|
file = g_file_new_for_path(filename);
|
||||||
stream = g_file_read(file, NULL, &err);
|
stream = g_file_read(file, NULL, &err);
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
@ -242,8 +278,12 @@ static void mdiary_add_file_to_store(gchar *filename, GtkListStore *entryListSto
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dstream = g_data_input_stream_new(G_INPUT_STREAM(stream));
|
dstream = g_data_input_stream_new(G_INPUT_STREAM(stream));
|
||||||
|
}
|
||||||
|
|
||||||
while (line = g_data_input_stream_read_line(G_DATA_INPUT_STREAM(dstream), NULL, NULL, NULL)) {
|
content_ptr = content;
|
||||||
|
|
||||||
|
while (line = (content ? mdiary_get_line_from_string(&content_ptr) :
|
||||||
|
g_data_input_stream_read_line(G_DATA_INPUT_STREAM(dstream), NULL, NULL, NULL))) {
|
||||||
if (header_state == 0) {
|
if (header_state == 0) {
|
||||||
if (!datetime) {
|
if (!datetime) {
|
||||||
datetime = mdiary_get_date_from_string_ext(line, "Date: .*", "");
|
datetime = mdiary_get_date_from_string_ext(line, "Date: .*", "");
|
||||||
@ -323,6 +363,31 @@ static void mdiary_add_file_to_store(gchar *filename, GtkListStore *entryListSto
|
|||||||
g_object_unref(file);
|
g_object_unref(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mdiary_add_gpg_to_store(gchar *filename, GtkListStore *entryListStore, GtkListStore *autoCompletion)
|
||||||
|
{
|
||||||
|
gchar *cmd = NULL;
|
||||||
|
gchar *cmd_stdout = NULL;
|
||||||
|
gchar *cmd_stderr = NULL;
|
||||||
|
gint exit_status = 0;
|
||||||
|
|
||||||
|
cmd = g_strdup_printf("gpg --decrypt %s", filename);
|
||||||
|
|
||||||
|
if (g_spawn_command_line_sync(cmd, &cmd_stdout, &cmd_stderr, &exit_status, NULL) && exit_status == 0) {
|
||||||
|
g_print("GPG: Decryption OK!\n");
|
||||||
|
mdiary_add_file_to_store(filename, cmd_stdout, entryListStore, autoCompletion);
|
||||||
|
} else {
|
||||||
|
g_print("GPG: Decryption of message failed!\n"
|
||||||
|
"---------- SNIP ----------\n"
|
||||||
|
"%s"
|
||||||
|
"---------- SNIP ----------\n",
|
||||||
|
cmd_stderr ? cmd_stderr : "Unknown error.");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(cmd);
|
||||||
|
g_free(cmd_stdout);
|
||||||
|
g_free(cmd_stderr);
|
||||||
|
}
|
||||||
|
|
||||||
static void mdiary_recurse_and_collect(gchar *base_dir,
|
static void mdiary_recurse_and_collect(gchar *base_dir,
|
||||||
GtkListStore *entryListStore,
|
GtkListStore *entryListStore,
|
||||||
GtkListStore *autoCompletion,
|
GtkListStore *autoCompletion,
|
||||||
@ -343,7 +408,13 @@ static void mdiary_recurse_and_collect(gchar *base_dir,
|
|||||||
regex = g_regex_new("\\.md$", G_REGEX_CASELESS, 0, NULL);
|
regex = g_regex_new("\\.md$", G_REGEX_CASELESS, 0, NULL);
|
||||||
if (g_regex_match(regex, fullPath, 0, &match_info) &&
|
if (g_regex_match(regex, fullPath, 0, &match_info) &&
|
||||||
g_match_info_matches(match_info))
|
g_match_info_matches(match_info))
|
||||||
mdiary_add_file_to_store(fullPath, entryListStore, autoCompletion);
|
mdiary_add_file_to_store(fullPath, NULL, entryListStore, autoCompletion);
|
||||||
|
g_regex_unref(regex);
|
||||||
|
|
||||||
|
regex = g_regex_new("\\.md.gpg$", G_REGEX_CASELESS, 0, NULL);
|
||||||
|
if (g_regex_match(regex, fullPath, 0, &match_info) &&
|
||||||
|
g_match_info_matches(match_info))
|
||||||
|
mdiary_add_gpg_to_store(fullPath, entryListStore, autoCompletion);
|
||||||
g_regex_unref(regex);
|
g_regex_unref(regex);
|
||||||
} else if (g_file_test(fullPath, G_FILE_TEST_IS_DIR) && max_level) {
|
} else if (g_file_test(fullPath, G_FILE_TEST_IS_DIR) && max_level) {
|
||||||
mdiary_recurse_and_collect(fullPath, entryListStore, autoCompletion, max_level--);
|
mdiary_recurse_and_collect(fullPath, entryListStore, autoCompletion, max_level--);
|
||||||
|
Loading…
Reference in New Issue
Block a user