summaryrefslogtreecommitdiff
path: root/sfeed_mbox.c
diff options
context:
space:
mode:
authorHiltjo Posthuma <hiltjo@codemadness.org>2021-07-06 18:27:28 +0200
committerHiltjo Posthuma <hiltjo@codemadness.org>2021-07-06 18:27:28 +0200
commited8079dc3e8ce513c788a5ab11444aac221cbc5b (patch)
tree1431fa5cde0464ff0351caad9d41fc622b4fe911 /sfeed_mbox.c
parent15983fa731e7e62fcc19db8dd04a12007a265e8f (diff)
sfeed_mbox: add option to print content
- Add SFEED_MBOX_CONTENT environment option. When set to "1" it outputs the content aswell. This is disabled by default for security reasons, because many clients handle HTML in an insecure way. - Print link and enclosure on one line and align them.
Diffstat (limited to 'sfeed_mbox.c')
-rw-r--r--sfeed_mbox.c80
1 files changed, 73 insertions, 7 deletions
diff --git a/sfeed_mbox.c b/sfeed_mbox.c
index a734504..5803cea 100644
--- a/sfeed_mbox.c
+++ b/sfeed_mbox.c
@@ -9,6 +9,7 @@
static char *line;
static size_t linesize;
static char host[256], *user, dtimebuf[32], mtimebuf[32];
+static int usecontent = 0; /* env variable: $SFEED_MBOX_CONTENT */
static unsigned long
djb2(unsigned char *s, unsigned long hash)
@@ -20,6 +21,38 @@ djb2(unsigned char *s, unsigned long hash)
return hash;
}
+/* Unescape / decode fields printed by string_print_encoded()
+ * "\\" to "\", "\t", to TAB, "\n" to newline. Unrecognised escape sequences
+ * are ignored: "\z" etc. Mangle "From " in mboxrd style (always prefix >). */
+static void
+printcontent(const char *s, FILE *fp)
+{
+escapefrom:
+ for (; *s == '>'; s++)
+ fputc('>', fp);
+ /* escape "From ", mboxrd-style. */
+ if (!strncmp(s, "From ", 5))
+ fputc('>', fp);
+
+ for (; *s; s++) {
+ switch (*s) {
+ case '\\':
+ s++;
+ switch (*s) {
+ case 'n':
+ fputc('\n', fp);
+ s++;
+ goto escapefrom;
+ case '\\': fputc('\\', fp); break;
+ case 't': fputc('\t', fp); break;
+ }
+ break;
+ default:
+ fputc(*s, fp); break;
+ }
+ }
+}
+
static void
printfeed(FILE *fp, const char *feedname)
{
@@ -28,6 +61,7 @@ printfeed(FILE *fp, const char *feedname)
time_t parsedtime;
unsigned long hash;
ssize_t linelen;
+ int ishtml;
while ((linelen = getline(&line, &linesize, fp)) > 0) {
if (line[linelen - 1] == '\n')
@@ -54,14 +88,44 @@ printfeed(FILE *fp, const char *feedname)
fields[FieldUnixTimestamp],
fields[FieldUnixTimestamp][0] ? "." : "",
hash, feedname);
- printf("Content-Type: text/plain; charset=\"utf-8\"\n");
- printf("Content-Transfer-Encoding: binary\n");
- printf("X-Feedname: %s\n\n", feedname);
- printf("%s\n", fields[FieldLink]);
- if (fields[FieldEnclosure][0])
- printf("\nEnclosure:\n%s\n", fields[FieldEnclosure]);
+ ishtml = usecontent && !strcmp(fields[FieldContentType], "html");
+ if (ishtml)
+ fputs("Content-Type: text/html; charset=\"utf-8\"\n", stdout);
+ else
+ fputs("Content-Type: text/plain; charset=\"utf-8\"\n", stdout);
+ fputs("Content-Transfer-Encoding: binary\n", stdout);
+ printf("X-Feedname: %s\n", feedname);
fputs("\n", stdout);
+
+ if (ishtml) {
+ fputs("<p>\n", stdout);
+ if (fields[FieldLink][0]) {
+ fputs("Link: <a href=\"", stdout);
+ xmlencode(fields[FieldLink], stdout);
+ fputs("\">", stdout);
+ fputs(fields[FieldLink], stdout);
+ fputs("</a><br/>\n", stdout);
+ }
+ if (fields[FieldEnclosure][0]) {
+ fputs("Enclosure: <a href=\"", stdout);
+ xmlencode(fields[FieldEnclosure], stdout);
+ fputs("\">", stdout);
+ fputs(fields[FieldEnclosure], stdout);
+ fputs("</a><br/>\n", stdout);
+ }
+ fputs("</p>\n", stdout);
+ } else {
+ if (fields[FieldLink][0])
+ printf("Link: %s\n", fields[FieldLink]);
+ if (fields[FieldEnclosure][0])
+ printf("Enclosure: %s\n", fields[FieldEnclosure]);
+ }
+ if (usecontent) {
+ fputs("\n", stdout);
+ printcontent(fields[FieldContent], stdout);
+ }
+ fputs("\n\n", stdout);
}
}
@@ -71,12 +135,14 @@ main(int argc, char *argv[])
struct tm tmnow;
time_t now;
FILE *fp;
- char *name;
+ char *name, *tmp;
int i;
if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1)
err(1, "pledge");
+ if ((tmp = getenv("SFEED_MBOX_CONTENT")))
+ usecontent = !strcmp(tmp, "1");
if (!(user = getenv("USER")))
user = "you";
if (gethostname(host, sizeof(host)) == -1)