commit e93ed5cc1cbe6d2ec391971bb3599a63539851d0 from: Stefan Sperling via: Thomas Adam date: Sun May 26 14:04:47 2024 UTC fix empty notification messages with multiple gotd notification targets When multiple notification targets are configured only the first target received notification message content. The subsequent targets would read EOF when trying to read the content. Fix this issue and add regression test coverage for it, exercising existing test code with a gotd.conf file which contains two notification targets. commit - 7ea1d42ff866342a8d20244d367a6f639a98d37a commit + e93ed5cc1cbe6d2ec391971bb3599a63539851d0 blob - e0fc6e235bf2dc7339ededb292d026715f715456 blob + 1bafd105316d87c5c2e31cbd9217e6f18ce72997 --- gotd/notify.c +++ gotd/notify.c @@ -316,14 +316,12 @@ send_notification(struct imsg *imsg, struct gotd_imsge username = strndup(imsg->data + sizeof(inotify), inotify.username_len); if (username == NULL) return got_error_from_errno("strndup"); - - if (lseek(fd, 0, SEEK_SET) == -1) { - err = got_error_from_errno("lseek"); - goto done; - } - STAILQ_FOREACH(target, &repo->notification_targets, entry) { + if (lseek(fd, 0, SEEK_SET) == -1) { + err = got_error_from_errno("lseek"); + goto done; + } switch (target->type) { case GOTD_NOTIFICATION_VIA_EMAIL: notify_email(target, inotify.subject_line, fd); blob - d210ed777ad16244f17aecd012723366f8862c8c blob + c13b67c82aa5229e4094d4cfbb6d0128f387a31d --- regress/gotd/Makefile +++ regress/gotd/Makefile @@ -184,6 +184,19 @@ start_gotd_email_notification: ensure_root @$(GOTD_TRAP); sleep .5 start_gotd_http_notification: ensure_root + @echo 'listen on "$(GOTD_SOCK)"' > $(PWD)/gotd.conf + @echo "user $(GOTD_USER)" >> $(PWD)/gotd.conf + @echo 'repository "test-repo" {' >> $(PWD)/gotd.conf + @echo ' path "$(GOTD_TEST_REPO)"' >> $(PWD)/gotd.conf + @echo ' permit rw $(GOTD_DEVUSER)' >> $(PWD)/gotd.conf + @echo ' notify {' >> $(PWD)/gotd.conf + @echo ' url "http://localhost:${GOTD_TEST_HTTP_PORT}/" user flan password "password" insecure' >> $(PWD)/gotd.conf + @echo " }" >> $(PWD)/gotd.conf + @echo "}" >> $(PWD)/gotd.conf + @$(GOTD_TRAP); $(GOTD_START_CMD) + @$(GOTD_TRAP); sleep .5 + +start_gotd_email_and_http_notification: ensure_root @echo 'listen on "$(GOTD_SOCK)"' > $(PWD)/gotd.conf @echo "user $(GOTD_USER)" >> $(PWD)/gotd.conf @echo 'repository "test-repo" {' >> $(PWD)/gotd.conf @@ -191,6 +204,8 @@ start_gotd_http_notification: ensure_root @echo ' permit rw $(GOTD_DEVUSER)' >> $(PWD)/gotd.conf @echo ' notify {' >> $(PWD)/gotd.conf @echo ' url "http://localhost:${GOTD_TEST_HTTP_PORT}/" user flan password "password" insecure' >> $(PWD)/gotd.conf + @echo -n ' email to ${GOTD_DEVUSER}' >> $(PWD)/gotd.conf + @echo ' relay 127.0.0.1 port ${GOTD_TEST_SMTP_PORT}' >> $(PWD)/gotd.conf @echo " }" >> $(PWD)/gotd.conf @echo "}" >> $(PWD)/gotd.conf @$(GOTD_TRAP); $(GOTD_START_CMD) @@ -279,6 +294,13 @@ test_http_notification: prepare_test_repo start_gotd_h 'env $(GOTD_TEST_ENV) sh ./http_notification.sh' @$(GOTD_STOP_CMD) 2>/dev/null +test_email_and_http_notification: prepare_test_repo start_gotd_email_and_http_notification + @-$(GOTD_TRAP); su -m ${GOTD_TEST_USER} -c \ + 'env $(GOTD_TEST_ENV) sh ./http_notification.sh test_file_changed' + @-$(GOTD_TRAP); su -m ${GOTD_TEST_USER} -c \ + 'env $(GOTD_TEST_ENV) sh ./email_notification.sh test_file_changed' + @$(GOTD_STOP_CMD) 2>/dev/null + test_git_interop: prepare_test_repo start_gotd_rw @-$(GOTD_TRAP); su ${GOTD_TEST_USER} -c \ 'env $(GOTD_TEST_ENV) sh ./test_git_interop.sh'