1
0
mirror of https://github.com/certbot/certbot.git synced 2026-01-21 19:01:07 +03:00

Added reporter messages for failed challenges.

This commit is contained in:
Brad Warren
2015-06-24 11:46:39 -07:00
parent d4bdba9726
commit 512e02c837
2 changed files with 103 additions and 7 deletions

View File

@@ -3,12 +3,15 @@ import itertools
import logging
import time
import zope.component
from acme import challenges
from acme import messages
from letsencrypt import achallenges
from letsencrypt import constants
from letsencrypt import errors
from letsencrypt import interfaces
class AuthHandler(object):
@@ -193,6 +196,7 @@ class AuthHandler(object):
updated for _, updated in failed_achalls)
if all_failed_achalls:
_report_failed_challs(all_failed_achalls)
raise errors.FailedChallenges(all_failed_achalls)
dom_to_check -= comp_domains
@@ -480,3 +484,86 @@ def is_preferred(offered_challb, satisfied,
different=True):
return False
return True
_ERROR_HELP_COMMON = (
'To fix these errors, please make sure that your domain name was entered '
'correctly and the DNS A/AAAA record(s) for that domain contains the '
'right IP address.'
)
_ERROR_HELP = {
'connection' :
_ERROR_HELP_COMMON + ' Additionally, please check that your computer '
'has publicly routable IP address and no firewalls are preventing the '
'server from communicating with the client.',
'dnssec' :
_ERROR_HELP_COMMON + ' Additionally, if you have DNSSEC enabled for '
'your domain, please ensure the signature is valid.',
'malformed' :
'To fix these errors, please make sure that you did not provide any '
'invalid information to the client and try running Let\'s Encrypt '
'again.',
'serverInternal' :
'Unfortunately, an error on the ACME server prevented you from completing '
'authorization. Please try again later.',
'tls' :
_ERROR_HELP_COMMON + ' Additionally, please check that you have an up '
'to date TLS configuration that allows the server to communicate with '
'the Let\'s Encrypt client.',
'unauthorized' : _ERROR_HELP_COMMON,
'unknownHost' :
'To fix these errors, please make sure that your domain name was '
'entered correctly.',
}
def _report_failed_challs(failed_achalls):
"""Notifies the user about failed challenges.
:param set failed_achalls: A set of failed
:class:`letsencrypt.achallenges.AnnotatedChallenge`.
"""
problems = dict()
for achall in failed_achalls:
if achall.error:
problems.setdefault(achall.error.typ, []).append(achall)
reporter = zope.component.getUtility(interfaces.IReporter)
for achalls in problems.itervalues():
reporter.add_message(_generate_failed_chall_msg(achalls), 1, True)
def _generate_failed_chall_msg(failed_achalls):
"""Creates a user friendly error message about failed challenges.
:param list failed_achalls: A list of failed
:class:`letsencrypt.achallenges.AnnotatedChallenge` with the same error
type.
:returns: A formatted error message for the client.
:rtype: str
"""
typ = failed_achalls[0].error.typ
msg = [
'The following \'{0}\' errors were reported by the server:'.format(typ)
]
problems = dict()
for achall in failed_achalls:
problems.setdefault(achall.error.description, []).append(achall.domain)
for problem in problems:
domains = problems[problem]
domains.sort()
msg.append('\n\nDomains: ')
msg.append(', '.join(domains))
msg.append('\nError: {0}'.format(problem))
if typ in _ERROR_HELP:
msg.append('\n\n')
msg.append(_ERROR_HELP[typ])
return "".join(msg)

View File

@@ -46,9 +46,10 @@ class Reporter(object):
printed if the program exits abnormally.
"""
assert self.HIGH_PRIORITY <= priority <= self.LOW_PRIORITY
self.messages.put(self._msg_type(priority, msg, on_crash))
logging.info("Reporting to user: %s", msg)
if msg:
assert self.HIGH_PRIORITY <= priority <= self.LOW_PRIORITY
self.messages.put(self._msg_type(priority, msg, on_crash))
logging.info("Reporting to user: %s", msg)
def atexit_print_messages(self, pid=os.getpid()):
"""Function to be registered with atexit to print messages.
@@ -66,7 +67,8 @@ class Reporter(object):
If there is an unhandled exception, only messages for which
``on_crash`` is ``True`` are printed.
"""
"""
bold_on = False
if not self.messages.empty():
no_exception = sys.exc_info()[0] is None
@@ -74,14 +76,21 @@ class Reporter(object):
if bold_on:
print self._BOLD
print 'IMPORTANT NOTES:'
wrapper = textwrap.TextWrapper(initial_indent=' - ',
subsequent_indent=(' ' * 3))
first_wrapper = textwrap.TextWrapper(
initial_indent=' - ', subsequent_indent=(' ' * 3))
next_wrapper = textwrap.TextWrapper(
initial_indent=first_wrapper.subsequent_indent,
subsequent_indent=first_wrapper.subsequent_indent)
while not self.messages.empty():
msg = self.messages.get()
if no_exception or msg.on_crash:
if bold_on and msg.priority > self.HIGH_PRIORITY:
sys.stdout.write(self._RESET)
bold_on = False
print wrapper.fill(msg.text)
lines = msg.text.splitlines()
print first_wrapper.fill(lines[0])
if len(lines) > 1:
print "\n".join(
next_wrapper.fill(line) for line in lines[1:])
if bold_on:
sys.stdout.write(self._RESET)