Currently, gather_print_notices.pl tries to open a file to write notices to, but it does not check that the open() succeeded. This can result in the following error error, if you point at a location you do not have write access to: print() on closed filehandle $OUTPUT at /usr/share/koha/bin/cronjobs/gather_print_notices.pl line 129. But the script proceeds on its merry way, and marks the "pending" messages it found as "sent", which means you can't re-run the script with another location and gather up the notices you meant to gather up. I'll propose to replace the current "open(...)" with an "open(...) or die()". (I'll probably do a patch for this during training on Monday, so please don't fix it before that :-)
Created attachment 23181 [details] [review] Bug 11188 - Make gather_print_notices.pl die on failed open() Problem: If you tell gather_print_notices.pl to write output to a location you do not have write access to, it will silently fail to write the data, but still mark unsent messages as sent. Solution: This patch adds two lines of defense: 1. Check that the location given for the output is writable 2. use "open() or die" instead of just "open()" when writing the output The first measure should catch most of the potential errors, but I guess a directory can be writable, but the open() still can fail because the disk is full or something similar. To test: - Make sure you have some unsent messages in the message_queue table, that do not have an email adress - Apply the patch - Run the script, pointing at a location you do not have access to write to. Check that the script exits with an appropriate error message, and that the unsent messages are still unsent. Do this both with and without the -s option. - To fake passing the first line of defence, comment out line 62 and put this in instead: if ( !$output_directory || !-d $output_directory ) { - Run the script again as above, check you get an appropriate error and that the message queue is not touched - Reset line 62 to how it was - Run the script against a directory you do have access to write to and check that output is produced as expected and that messages are marked as sent - Sign off
Created attachment 23849 [details] [review] Bug 11188 - Make gather_print_notices.pl die on failed open() Problem: If you tell gather_print_notices.pl to write output to a location you do not have write access to, it will silently fail to write the data, but still mark unsent messages as sent. Solution: This patch adds two lines of defense: 1. Check that the location given for the output is writable 2. use "open() or die" instead of just "open()" when writing the output The first measure should catch most of the potential errors, but I guess a directory can be writable, but the open() still can fail because the disk is full or something similar. To test: - Make sure you have some unsent messages in the message_queue table, that do not have an email adress - Apply the patch - Run the script, pointing at a location you do not have access to write to. Check that the script exits with an appropriate error message, and that the unsent messages are still unsent. Do this both with and without the -s option. - To fake passing the first line of defence, comment out line 62 and put this in instead: if ( !$output_directory || !-d $output_directory ) { - Run the script again as above, check you get an appropriate error and that the message queue is not touched - Reset line 62 to how it was - Run the script against a directory you do have access to write to and check that output is produced as expected and that messages are marked as sent - Sign off Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz>
Created attachment 23855 [details] [review] [PASSED QA] Bug 11188 - Make gather_print_notices.pl die on failed open() Problem: If you tell gather_print_notices.pl to write output to a location you do not have write access to, it will silently fail to write the data, but still mark unsent messages as sent. Solution: This patch adds two lines of defense: 1. Check that the location given for the output is writable 2. use "open() or die" instead of just "open()" when writing the output The first measure should catch most of the potential errors, but I guess a directory can be writable, but the open() still can fail because the disk is full or something similar. To test: - Make sure you have some unsent messages in the message_queue table, that do not have an email adress - Apply the patch - Run the script, pointing at a location you do not have access to write to. Check that the script exits with an appropriate error message, and that the unsent messages are still unsent. Do this both with and without the -s option. - To fake passing the first line of defence, comment out line 62 and put this in instead: if ( !$output_directory || !-d $output_directory ) { - Run the script again as above, check you get an appropriate error and that the message queue is not touched - Reset line 62 to how it was - Run the script against a directory you do have access to write to and check that output is produced as expected and that messages are marked as sent - Sign off Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz> Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de> Passes all tests and QA script. Works as described.
Pushed to master. Thanks, Magnus!
Patch pushed to 3.14.x, will be in 3.14.3.
This patch has been pushed to 3.12.x, will be in 3.12.11. Thanks Magnus!