Skip to content

Commit 8dec31f

Browse files
committed
Fix certbot hook crash on bare two-part domains
1 parent 085e407 commit 8dec31f

1 file changed

Lines changed: 63 additions & 49 deletions

File tree

tools/certbot/certbot_renew_hook.py

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,97 +10,111 @@
1010

1111

1212
def get_tld(validation_domain):
13-
tld_pattern = r'\.([^.]+\.[^.]+)$'
13+
parts = validation_domain.split(".")
14+
if len(parts) <= 2:
15+
return validation_domain
16+
tld_pattern = r"\.([^.]+\.[^.]+)$"
1417
match = re.search(tld_pattern, validation_domain)
1518
if match:
16-
tld = match.group(1)
17-
return tld
18-
else:
19-
return None
19+
return match.group(1)
20+
return None
2021

2122

2223
def get_validation_subdomain(validation_domain, domain):
23-
return validation_domain.replace('.' + domain, '')
24+
return validation_domain.replace("." + domain, "")
2425

2526

2627
def authorize():
2728
payload = {
28-
'login': os.environ.get('BW_USER_LOGIN'),
29-
'secret': os.environ.get('BW_USER_SECRET')
29+
"login": os.environ.get("BW_USER_LOGIN"),
30+
"secret": os.environ.get("BW_USER_SECRET"),
3031
}
3132

32-
response = requests.post(os.environ.get(
33-
'BW_BASE_URL') + '/api/auth/token', json=payload)
33+
response = requests.post(
34+
os.environ.get("BW_BASE_URL") + "/api/auth/token", json=payload
35+
)
3436

3537
if response.status_code == 200:
36-
return response.json()['token']
38+
return response.json()["token"]
3739

38-
print('Error authorizing. Response code: ' + str(response.status_code))
39-
raise Exception('Authorization error')
40+
print("Error authorizing. Response code: " + str(response.status_code))
41+
raise Exception("Authorization error")
4042

4143

4244
def perform_dns_challenge(validation_domain, validation_token):
4345
domain = get_tld(validation_domain)
4446

4547
headers = {
46-
'Authorization': 'Bearer ' + authorize(),
47-
'Content-Type': 'application/json'
48+
"Authorization": "Bearer " + authorize(),
49+
"Content-Type": "application/json",
4850
}
4951

50-
payload = json.dumps({
51-
'autocommit': True,
52-
'data': validation_token,
53-
'subdomain': '_acme-challenge.' + get_validation_subdomain(validation_domain, domain),
54-
'ttl': 300,
55-
'type': 'TXT'
56-
})
57-
58-
response = requests.post(os.environ.get(
59-
'BW_BASE_URL') + '/api/v1/domain/' + domain + '/record', data=payload, headers=headers)
52+
payload = json.dumps(
53+
{
54+
"autocommit": True,
55+
"data": validation_token,
56+
"subdomain": "_acme-challenge."
57+
+ get_validation_subdomain(validation_domain, domain),
58+
"ttl": 300,
59+
"type": "TXT",
60+
}
61+
)
62+
63+
response = requests.post(
64+
os.environ.get("BW_BASE_URL") + "/api/v1/domain/" + domain + "/record",
65+
data=payload,
66+
headers=headers,
67+
)
6068

6169
if response.status_code == 201:
6270
sleep(600)
63-
print('DNS challenge completed successfully.')
71+
print("DNS challenge completed successfully.")
6472
else:
65-
print('Error performing DNS challenge.')
66-
raise Exception('DNS challenge failed.')
73+
print("Error performing DNS challenge.")
74+
raise Exception("DNS challenge failed.")
6775

6876

6977
def cleanup_dns_challenge(validation_domain, validation_token):
7078
domain = get_tld(validation_domain)
7179

7280
headers = {
73-
'Authorization': 'Bearer ' + authorize(),
74-
'Content-Type': 'application/json'
81+
"Authorization": "Bearer " + authorize(),
82+
"Content-Type": "application/json",
7583
}
7684

77-
payload = json.dumps({
78-
'autocommit': True,
79-
'data': validation_token,
80-
'subdomain': '_acme-challenge.' + get_validation_subdomain(validation_domain, domain),
81-
'ttl': 300,
82-
'type': 'TXT'
83-
})
84-
85-
response = requests.delete(os.environ.get('BW_BASE_URL') + '/api/v1/domain/' + domain
86-
+ '/record/', data=payload, headers=headers)
85+
payload = json.dumps(
86+
{
87+
"autocommit": True,
88+
"data": validation_token,
89+
"subdomain": "_acme-challenge."
90+
+ get_validation_subdomain(validation_domain, domain),
91+
"ttl": 300,
92+
"type": "TXT",
93+
}
94+
)
95+
96+
response = requests.delete(
97+
os.environ.get("BW_BASE_URL") + "/api/v1/domain/" + domain + "/record/",
98+
data=payload,
99+
headers=headers,
100+
)
87101

88102
if response.status_code == 200:
89-
print('DNS challenge cleanup completed successfully.')
103+
print("DNS challenge cleanup completed successfully.")
90104
else:
91-
print('Error performing DNS challenge cleanup.')
92-
print('Response: ' + response.text)
93-
raise Exception('DNS challenge cleanup failed.')
105+
print("Error performing DNS challenge cleanup.")
106+
print("Response: " + response.text)
107+
raise Exception("DNS challenge cleanup failed.")
94108

95109

96-
if __name__ == '__main__':
110+
if __name__ == "__main__":
97111
load_dotenv()
98112

99113
hook_action = sys.argv[1]
100-
domain = os.environ.get('CERTBOT_DOMAIN')
101-
token = os.environ.get('CERTBOT_VALIDATION')
114+
domain = os.environ.get("CERTBOT_DOMAIN")
115+
token = os.environ.get("CERTBOT_VALIDATION")
102116

103-
if hook_action == 'deploy_challenge':
117+
if hook_action == "deploy_challenge":
104118
perform_dns_challenge(domain, token)
105-
elif hook_action == 'clean_challenge':
119+
elif hook_action == "clean_challenge":
106120
cleanup_dns_challenge(domain, token)

0 commit comments

Comments
 (0)