This is an automated email from the ASF dual-hosted git repository. humbedooh pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-ponymail-foal.git
commit 98633b28fb3495543067e536b28bdab088f6f470 Author: Daniel Gruno <[email protected]> AuthorDate: Thu Sep 10 12:03:57 2020 +0200 Allow for traceback to be printed to the journal (stderr) instead of to the client --- INSTALL.md | 8 +++++++- server/main.py | 17 ++++++++++++++--- server/plugins/configuration.py | 4 ++++ tools/setup.py | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 46478b2..51cbe7c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -127,4 +127,10 @@ separating each entry with a single space: - to allow email for all lists at any subdomain under mydomain.tld, you should add `*.mydomain.tld` Only users logged in via authoritative OAuth will be able to compose replies via the -web interface. \ No newline at end of file +web interface. + +## Hiding tracebacks from users +By default, API errors will include a full traceback for debugging purposes. If you wish to +instead have this be printed to the system journal (`stderr`), you can set the `traceback` +option to `false` in `server/ponymail.yaml`. This will instead print an error ID to the user, +corresponding to a traceback in stderr. diff --git a/server/main.py b/server/main.py index 45c64ec..22161ed 100644 --- a/server/main.py +++ b/server/main.py @@ -27,6 +27,7 @@ import traceback import aiohttp.web import yaml +import uuid import plugins.background import plugins.configuration @@ -132,9 +133,19 @@ class Server(plugins.server.BaseServer): err = "\n".join( traceback.format_exception(exc_type, exc_value, exc_traceback) ) - return aiohttp.web.Response( - headers=headers, status=500, text="API error occurred: " + err - ) + if self.config.ui.traceback: + return aiohttp.web.Response( + headers=headers, status=500, text="API error occurred: " + err + ) + else: + eid = str(uuid.uuid4())[:18] + sys.stderr.write("API Endpoint %s got into trouble (%s): \n" % (request.path, eid)) + for line in err.split("\n"): + sys.stderr.write("%s: %s\n" % (eid, line)) + return aiohttp.web.Response( + headers=headers, status=500, text="API error occurred. The application journal will have " + "information. Error ID: %s" % eid + ) else: return aiohttp.web.Response( headers=headers, status=404, text="API Endpoint not found!" diff --git a/server/plugins/configuration.py b/server/plugins/configuration.py index 7ab746b..4546a59 100644 --- a/server/plugins/configuration.py +++ b/server/plugins/configuration.py @@ -18,11 +18,15 @@ class UIConfig: wordcloud: bool mailhost: str sender_domains: str + traceback: bool def __init__(self, subyaml: dict): self.wordcloud = bool(subyaml.get('wordcloud', False)) self.mailhost = subyaml.get('mailhost', '') # Default to nothing (disabled) self.sender_domains = subyaml.get('sender_domains', '') # Default to nothing (disabled) + # Default to spitting out traceback to web clients + # Set to false in yaml to redirect to stderr instead. + self.traceback = subyaml.get('traceback', True) class OAuthConfig: diff --git a/tools/setup.py b/tools/setup.py index bcc8ccc..cbbadc9 100755 --- a/tools/setup.py +++ b/tools/setup.py @@ -451,6 +451,7 @@ ui: wordcloud: %s mailhost: %s sender_domains: %s + traceback: true tasks: refresh_rate: 150 # Background indexer run interval, in seconds
