utils/source-discoverer: Allow ICS with LF line breaks
RFC 5545 states that CRLF line breaks should be used but other consumer seems to allow CR being missing. https://datatracker.ietf.org/doc/html/rfc5545#section-3.1 Note, that the check result was ignored if the content-type is text/calendar. Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/814>
This commit is contained in:
@@ -27,7 +27,7 @@
|
|||||||
#include "gcal-source-discoverer.h"
|
#include "gcal-source-discoverer.h"
|
||||||
#include "gcal-utils.h"
|
#include "gcal-utils.h"
|
||||||
|
|
||||||
#define ICAL_HEADER_STRING "BEGIN:VCALENDAR\r\n"
|
#define ICAL_HEADER_STRING "BEGIN:VCALENDAR"
|
||||||
|
|
||||||
G_DEFINE_QUARK (GcalSourceDiscoverer, gcal_source_discoverer_error);
|
G_DEFINE_QUARK (GcalSourceDiscoverer, gcal_source_discoverer_error);
|
||||||
|
|
||||||
@@ -262,6 +262,7 @@ discover_file_in_thread (DiscovererData *data,
|
|||||||
g_autoptr (GPtrArray) source = NULL;
|
g_autoptr (GPtrArray) source = NULL;
|
||||||
g_autoptr (GUri) guri = NULL;
|
g_autoptr (GUri) guri = NULL;
|
||||||
g_autofree gchar *header_string = NULL;
|
g_autofree gchar *header_string = NULL;
|
||||||
|
gsize header_string_len;
|
||||||
gsize header_string_read_len;
|
gsize header_string_read_len;
|
||||||
gboolean is_calendar_header;
|
gboolean is_calendar_header;
|
||||||
const gchar *content_type;
|
const gchar *content_type;
|
||||||
@@ -292,16 +293,18 @@ discover_file_in_thread (DiscovererData *data,
|
|||||||
if (!input_stream)
|
if (!input_stream)
|
||||||
GCAL_RETURN (NULL);
|
GCAL_RETURN (NULL);
|
||||||
|
|
||||||
header_string = g_malloc0 (sizeof (gchar) * (strlen (ICAL_HEADER_STRING) + 1));
|
/* 2 to cover CRLF or LF, only the former is RFC compliant */
|
||||||
|
header_string_len = strlen (ICAL_HEADER_STRING) + 2;
|
||||||
|
header_string = g_malloc0 (sizeof (gchar) * (header_string_len + 1));
|
||||||
g_input_stream_read_all (input_stream,
|
g_input_stream_read_all (input_stream,
|
||||||
header_string,
|
header_string,
|
||||||
strlen (ICAL_HEADER_STRING),
|
header_string_len,
|
||||||
&header_string_read_len,
|
&header_string_read_len,
|
||||||
cancellable,
|
cancellable,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
is_calendar_header = header_string_read_len == strlen (ICAL_HEADER_STRING) &&
|
is_calendar_header = header_string_read_len == header_string_len &&
|
||||||
g_strcmp0 (ICAL_HEADER_STRING, header_string) == 0;
|
g_regex_match_simple ("^" ICAL_HEADER_STRING "\\r?\\n", header_string, G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT);
|
||||||
|
|
||||||
g_input_stream_close (input_stream, cancellable, error);
|
g_input_stream_close (input_stream, cancellable, error);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user