diff options
| author | 2022-10-21 19:07:20 +0200 | |
|---|---|---|
| committer | 2022-10-21 19:07:20 +0200 | |
| commit | 084731fec24932ad48c48c5147d129ce2af0ccc8 (patch) | |
| tree | b8f733e0419fb5ea851a5030273b5e3cff808b10 | |
| parent | Version 2.06 RELEASED. (diff) | |
| download | penes-snac2-084731fec24932ad48c48c5147d129ce2af0ccc8.tar.gz penes-snac2-084731fec24932ad48c48c5147d129ce2af0ccc8.tar.xz penes-snac2-084731fec24932ad48c48c5147d129ce2af0ccc8.zip | |
Send notification emails through the queue.
| -rw-r--r-- | activitypub.c | 53 | ||||
| -rw-r--r-- | data.c | 21 | ||||
| -rw-r--r-- | snac.h | 1 |
3 files changed, 54 insertions, 21 deletions
diff --git a/activitypub.c b/activitypub.c index 24bf04e..5b2d981 100644 --- a/activitypub.c +++ b/activitypub.c | |||
| @@ -626,8 +626,6 @@ d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to, char | |||
| 626 | } | 626 | } |
| 627 | 627 | ||
| 628 | 628 | ||
| 629 | |||
| 630 | |||
| 631 | void notify(snac *snac, char *type, char *utype, char *actor, char *msg) | 629 | void notify(snac *snac, char *type, char *utype, char *actor, char *msg) |
| 632 | /* notifies the user of relevant events */ | 630 | /* notifies the user of relevant events */ |
| 633 | { | 631 | { |
| @@ -670,7 +668,7 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg) | |||
| 670 | 668 | ||
| 671 | xs *subject = xs_fmt("snac notify for @%s@%s", | 669 | xs *subject = xs_fmt("snac notify for @%s@%s", |
| 672 | xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host")); | 670 | xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host")); |
| 673 | xs *from = xs_fmt("snac-daemon@%s (snac daemon)", xs_dict_get(srv_config, "host")); | 671 | xs *from = xs_fmt("snac-daemon <snac-daemon@%s>", xs_dict_get(srv_config, "host")); |
| 674 | xs *header = xs_fmt( | 672 | xs *header = xs_fmt( |
| 675 | "From: %s\n" | 673 | "From: %s\n" |
| 676 | "To: %s\n" | 674 | "To: %s\n" |
| @@ -699,23 +697,7 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg) | |||
| 699 | body = xs_str_cat(body, s1); | 697 | body = xs_str_cat(body, s1); |
| 700 | } | 698 | } |
| 701 | 699 | ||
| 702 | /* now write */ | 700 | enqueue_email(snac, body, 0); |
| 703 | FILE *f; | ||
| 704 | |||
| 705 | if ((f = popen("/usr/sbin/sendmail -t", "w")) != NULL) { | ||
| 706 | fprintf(f, "%s\n", body); | ||
| 707 | |||
| 708 | if (fclose(f) == EOF) { | ||
| 709 | snac_log(snac, xs_fmt("fclose error in pipe to sendmail (errno: %d)", errno)); | ||
| 710 | |||
| 711 | if ((f = fopen("/tmp/dead-letter", "w")) != NULL) { | ||
| 712 | fprintf(f, "%s\n", body); | ||
| 713 | fclose(f); | ||
| 714 | } | ||
| 715 | } | ||
| 716 | } | ||
| 717 | else | ||
| 718 | snac_log(snac, xs_fmt("cannot pipe to sendmail (errno: %d)", errno)); | ||
| 719 | } | 701 | } |
| 720 | 702 | ||
| 721 | 703 | ||
| @@ -958,6 +940,35 @@ void process_queue(snac *snac) | |||
| 958 | } | 940 | } |
| 959 | } | 941 | } |
| 960 | } | 942 | } |
| 943 | else | ||
| 944 | if (strcmp(type, "email") == 0) { | ||
| 945 | /* send this email */ | ||
| 946 | char *msg = xs_dict_get(q_item, "message"); | ||
| 947 | int retries = xs_number_get(xs_dict_get(q_item, "retries")); | ||
| 948 | FILE *f; | ||
| 949 | int ok = 0; | ||
| 950 | |||
| 951 | if ((f = popen("/usr/sbin/sendmail -t", "w")) != NULL) { | ||
| 952 | fprintf(f, "%s\n", msg); | ||
| 953 | |||
| 954 | if (fclose(f) != EOF) | ||
| 955 | ok = 1; | ||
| 956 | } | ||
| 957 | |||
| 958 | if (ok) | ||
| 959 | snac_debug(snac, 1, xs_fmt("email message sent")); | ||
| 960 | else { | ||
| 961 | if (retries > queue_retry_max) | ||
| 962 | snac_log(snac, xs_fmt("process_queue email giving up (errno: %d)", errno)); | ||
| 963 | else { | ||
| 964 | /* requeue */ | ||
| 965 | snac_log(snac, xs_fmt( | ||
| 966 | "process_queue email requeue %d (errno: %d)", retries + 1, errno)); | ||
| 967 | |||
| 968 | enqueue_email(snac, msg, retries + 1); | ||
| 969 | } | ||
| 970 | } | ||
| 971 | } | ||
| 961 | } | 972 | } |
| 962 | } | 973 | } |
| 963 | 974 | ||
| @@ -973,6 +984,8 @@ void post(snac *snac, char *msg) | |||
| 973 | enqueue_output(snac, msg, v, 0); | 984 | enqueue_output(snac, msg, v, 0); |
| 974 | } | 985 | } |
| 975 | } | 986 | } |
| 987 | |||
| 988 | |||
| 976 | /** HTTP handlers */ | 989 | /** HTTP handlers */ |
| 977 | 990 | ||
| 978 | int activitypub_get_handler(d_char *req, char *q_path, | 991 | int activitypub_get_handler(d_char *req, char *q_path, |
| @@ -980,6 +980,25 @@ void enqueue_output(snac *snac, char *msg, char *actor, int retries) | |||
| 980 | } | 980 | } |
| 981 | 981 | ||
| 982 | 982 | ||
| 983 | void enqueue_email(snac *snac, char *msg, int retries) | ||
| 984 | /* enqueues an email message to be sent */ | ||
| 985 | { | ||
| 986 | int qrt = xs_number_get(xs_dict_get(srv_config, "queue_retry_minutes")); | ||
| 987 | xs *ntid = tid(retries * 60 * qrt); | ||
| 988 | xs *fn = xs_fmt("%s/queue/%s.json", snac->basedir, ntid); | ||
| 989 | xs *qmsg = xs_dict_new(); | ||
| 990 | xs *rn = xs_number_new(retries); | ||
| 991 | |||
| 992 | qmsg = xs_dict_append(qmsg, "type", "email"); | ||
| 993 | qmsg = xs_dict_append(qmsg, "message", msg); | ||
| 994 | qmsg = xs_dict_append(qmsg, "retries", rn); | ||
| 995 | |||
| 996 | _enqueue_put(fn, qmsg); | ||
| 997 | |||
| 998 | snac_debug(snac, 1, xs_fmt("enqueue_email %d", retries)); | ||
| 999 | } | ||
| 1000 | |||
| 1001 | |||
| 983 | d_char *queue(snac *snac) | 1002 | d_char *queue(snac *snac) |
| 984 | /* returns a list with filenames that can be dequeued */ | 1003 | /* returns a list with filenames that can be dequeued */ |
| 985 | { | 1004 | { |
| @@ -997,7 +1016,7 @@ d_char *queue(snac *snac) | |||
| 997 | time_t t2 = atol(bn + 1); | 1016 | time_t t2 = atol(bn + 1); |
| 998 | 1017 | ||
| 999 | if (t2 > t) | 1018 | if (t2 > t) |
| 1000 | snac_debug(snac, 2, xs_fmt("queue not yet time for %s", v)); | 1019 | snac_debug(snac, 2, xs_fmt("queue not yet time for %s [%ld]", v, t)); |
| 1001 | else { | 1020 | else { |
| 1002 | list = xs_list_append(list, v); | 1021 | list = xs_list_append(list, v); |
| 1003 | snac_debug(snac, 2, xs_fmt("queue ready for %s", v)); | 1022 | snac_debug(snac, 2, xs_fmt("queue ready for %s", v)); |
| @@ -91,6 +91,7 @@ d_char *history_list(snac *snac); | |||
| 91 | 91 | ||
| 92 | void enqueue_input(snac *snac, char *msg, char *req, int retries); | 92 | void enqueue_input(snac *snac, char *msg, char *req, int retries); |
| 93 | void enqueue_output(snac *snac, char *msg, char *actor, int retries); | 93 | void enqueue_output(snac *snac, char *msg, char *actor, int retries); |
| 94 | void enqueue_email(snac *snac, char *msg, int retries); | ||
| 94 | 95 | ||
| 95 | d_char *queue(snac *snac); | 96 | d_char *queue(snac *snac); |
| 96 | d_char *dequeue(snac *snac, char *fn); | 97 | d_char *dequeue(snac *snac, char *fn); |