aboutsummaryrefslogtreecommitdiffstats
path: root/libemail-utils/e-signature-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libemail-utils/e-signature-utils.c')
-rw-r--r--libemail-utils/e-signature-utils.c336
1 files changed, 0 insertions, 336 deletions
diff --git a/libemail-utils/e-signature-utils.c b/libemail-utils/e-signature-utils.c
deleted file mode 100644
index ca46f053db..0000000000
--- a/libemail-utils/e-signature-utils.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * e-signature-utils.c
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) version 3.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the program; if not, see <http://www.gnu.org/licenses/>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-signature-utils.h"
-
-#include <errno.h>
-#include <camel/camel.h>
-#include <glib/gstdio.h>
-
-#ifndef G_OS_WIN32
-#include <sys/wait.h>
-#endif
-
-#include <libedataserver/e-data-server-util.h>
-
-static ESignatureList *global_signature_list;
-
-ESignatureList *
-e_get_signature_list (void)
-{
- if (G_UNLIKELY (global_signature_list == NULL))
- global_signature_list = e_signature_list_new ();
-
- g_return_val_if_fail (global_signature_list != NULL, NULL);
-
- return global_signature_list;
-}
-
-ESignature *
-e_get_signature_by_name (const gchar *name)
-{
- ESignatureList *signature_list;
-
- g_return_val_if_fail (name != NULL, NULL);
-
- signature_list = e_get_signature_list ();
-
- return e_signature_list_find_by_name (signature_list, name);
-}
-
-ESignature *
-e_get_signature_by_uid (const gchar *uid)
-{
- ESignatureList *signature_list;
-
- g_return_val_if_fail (uid != NULL, NULL);
-
- signature_list = e_get_signature_list ();
-
- return e_signature_list_find_by_uid (signature_list, uid);
-}
-
-gchar *
-e_create_signature_file (GError **error)
-{
- const gchar *data_dir;
- gchar basename[32];
- gchar *filename;
- gchar *pathname;
- gint32 ii;
-
- data_dir = e_get_user_data_dir ();
- pathname = g_build_filename (data_dir, "signatures", NULL);
- filename = NULL;
-
- if (g_mkdir_with_parents (pathname, 0700) < 0) {
- g_set_error (
- error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "%s: %s", pathname, g_strerror (errno));
- g_free (pathname);
- return NULL;
- }
-
- for (ii = 0; ii < G_MAXINT32; ii++) {
-
- g_snprintf (
- basename, sizeof (basename),
- "signature-%" G_GINT32_FORMAT, ii);
-
- g_free (filename);
- filename = g_build_filename (pathname, basename, NULL);
-
- if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
- gint fd;
-
- fd = g_creat (filename, 0600);
- if (fd >= 0) {
- close (fd);
- break;
- }
-
- /* If we failed once we're probably going
- * to continue failing, so just give up. */
- g_set_error (
- error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "%s: %s", filename, g_strerror (errno));
- g_free (filename);
- filename = NULL;
- break;
- }
- }
-
- /* If there are actually G_MAXINT32 signature files, the
- * most recent signature file we be overwritten. Sorry. */
-
- return filename;
-}
-
-gchar *
-e_read_signature_file (ESignature *signature,
- gboolean convert_to_html,
- GError **error)
-{
- CamelStream *input_stream;
- CamelStream *output_stream;
- GByteArray *buffer;
- const gchar *filename;
- gboolean is_html;
- gchar *content;
- gsize length;
- gint fd;
-
- g_return_val_if_fail (E_IS_SIGNATURE (signature), NULL);
-
- filename = e_signature_get_filename (signature);
- is_html = e_signature_get_is_html (signature);
-
- fd = g_open (filename, O_RDONLY, 0);
- if (fd < 0) {
- g_set_error (
- error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- "%s: %s", filename, g_strerror (errno));
- return NULL;
- }
-
- input_stream = camel_stream_fs_new_with_fd (fd);
-
- if (!is_html && convert_to_html) {
- CamelStream *filtered_stream;
- CamelMimeFilter *filter;
- gint32 flags;
-
- filtered_stream =
- camel_stream_filter_new (input_stream);
- g_object_unref (input_stream);
-
- flags =
- CAMEL_MIME_FILTER_TOHTML_PRESERVE_8BIT |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES |
- CAMEL_MIME_FILTER_TOHTML_CONVERT_SPACES;
- filter = camel_mime_filter_tohtml_new (flags, 0);
- camel_stream_filter_add (
- CAMEL_STREAM_FILTER (filtered_stream), filter);
- g_object_unref (filter);
-
- input_stream = filtered_stream;
- }
-
- buffer = g_byte_array_new ();
- output_stream = camel_stream_mem_new ();
- camel_stream_mem_set_byte_array (
- CAMEL_STREAM_MEM (output_stream), buffer);
- camel_stream_write_to_stream (input_stream, output_stream, NULL, NULL);
- g_object_unref (output_stream);
- g_object_unref (input_stream);
-
- /* Make sure the buffer is nul-terminated. */
- length = (gsize) buffer->len;
- g_byte_array_append (buffer, (guint8 *) "", 1);
- content = (gchar *) g_byte_array_free (buffer, FALSE);
-
- /* Signatures are saved as UTF-8, but we still need to check that
- * the signature is valid UTF-8 because the user may be opening
- * a signature file that is in his/her locale character set. If
- * it's not in UTF-8 then try converting from the current locale. */
- if (!g_utf8_validate (content, length, NULL)) {
- gchar *utf8;
-
- utf8 = g_locale_to_utf8 (content, length, NULL, NULL, error);
- g_free (content);
- content = utf8;
- }
-
- return content;
-}
-
-gchar *
-e_run_signature_script (const gchar *filename)
-{
- /* FIXME Make this cross-platform, prefer GLib functions over
- * POSIX, and report errors via GError instead of dumping
- * messages to the terminal where users won't see them. */
-
-#ifndef G_OS_WIN32
- gint in_fds[2];
- pid_t pid;
-
- g_return_val_if_fail (filename != NULL, NULL);
-
- if (pipe (in_fds) == -1) {
- g_warning (
- "Failed to create pipe to '%s': %s",
- filename, g_strerror (errno));
- return NULL;
- }
-
- pid = fork ();
-
- /* Child Process */
- if (pid == 0) {
- gint maxfd, ii;
-
- close (in_fds[0]);
- if (dup2 (in_fds[1], STDOUT_FILENO) < 0)
- _exit (255);
- close (in_fds[1]);
-
- setsid ();
-
- maxfd = sysconf (_SC_OPEN_MAX);
- for (ii = 3; ii < maxfd; ii++) {
- if (ii == STDIN_FILENO)
- continue;
- if (ii == STDOUT_FILENO)
- continue;
- if (ii == STDERR_FILENO)
- continue;
- fcntl (ii, F_SETFD, FD_CLOEXEC);
- }
-
- execlp ("/bin/sh", "/bin/sh", "-c", filename, NULL);
-
- g_warning (
- "Could not execute '%s': %s",
- filename, g_strerror (errno));
-
- _exit (255);
-
- /* Parent Process */
- } else if (pid > 0) {
- CamelStream *output_stream;
- CamelStream *input_stream;
- GByteArray *buffer;
- gchar *content;
- gsize length;
- gint result;
- gint status;
-
- close (in_fds[1]);
-
- buffer = g_byte_array_new ();
- output_stream = camel_stream_mem_new ();
- camel_stream_mem_set_byte_array (
- CAMEL_STREAM_MEM (output_stream), buffer);
-
- input_stream = camel_stream_fs_new_with_fd (in_fds[0]);
- camel_stream_write_to_stream (
- input_stream, output_stream, NULL, NULL);
- g_object_unref (input_stream);
-
- g_object_unref (output_stream);
-
- /* Make sure the buffer is nul-terminated. */
- length = (gsize) buffer->len;
- g_byte_array_append (buffer, (guchar *) "", 1);
- content = (gchar *) g_byte_array_free (buffer, FALSE);
-
- /* Signature scripts are supposed to generate UTF-8 content,
- * but because users are known to never read the manual, we
- * try to do our best if the content isn't valid UTF-8 by
- * assuming that the content is in the user's locale
- * character set. */
- if (!g_utf8_validate (content, length, NULL)) {
- gchar *utf8;
-
- /* XXX Should pass a GError here. */
- utf8 = g_locale_to_utf8 (
- content, length, NULL, NULL, NULL);
- g_free (content);
- content = utf8;
- }
-
- /* Wait for the script process to terminate. */
- result = waitpid (pid, &status, 0);
-
- if (result == -1 && errno == EINTR) {
- /* Child process is hanging... */
- kill (pid, SIGTERM);
- sleep (1);
- result = waitpid (pid, &status, WNOHANG);
- if (result == 0) {
- /* ...still hanging, set phasers to KILL. */
- kill (pid, SIGKILL);
- sleep (1);
- waitpid (pid, &status, WNOHANG);
- }
- }
-
- return content;
-
- /* Forking Failed */
- } else {
- g_warning (
- "Failed to create child process '%s': %s",
- filename, g_strerror (errno));
- close (in_fds[0]);
- close (in_fds[1]);
- }
-#endif
-
- return NULL;
-}