mirror of
https://github.com/certbot/certbot.git
synced 2026-08-01 02:44:21 +02:00
Merge remote-tracking branch 'origin/master' into delimiters
This commit is contained in:
-115
@@ -1,115 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
from datetime import datetime
|
|
||||||
import string
|
|
||||||
import collections
|
|
||||||
|
|
||||||
def parse_timestamp(ts):
|
|
||||||
try:
|
|
||||||
int(ts)
|
|
||||||
dt = datetime.fromtimestamp(ts)
|
|
||||||
return dt
|
|
||||||
except:
|
|
||||||
raise ValueError, "Invalid timestamp integer: " + `ts`
|
|
||||||
|
|
||||||
legal = string.letters + string.digits + ".-"
|
|
||||||
known_tlds =["com","org","net","biz","info",] # xxx make me from an ICANN list
|
|
||||||
def looks_like_a_domain(s):
|
|
||||||
"Return true if string looks like a domain, as best we can tell..."
|
|
||||||
global known_tlds
|
|
||||||
try:
|
|
||||||
domain = s.lower()
|
|
||||||
assert domain[0].islower()
|
|
||||||
assert all([c in legal for c in domain])
|
|
||||||
tld = s.split(".")[-1]
|
|
||||||
if tld not in known_tlds:
|
|
||||||
# XXX perform DNS query to determine that this TLD exists
|
|
||||||
pass
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
def __init__(self, cfg_file_name = "config.json"):
|
|
||||||
f = open(cfg_file_name)
|
|
||||||
self.cfg = json.loads(f.read())
|
|
||||||
self.tls_policies = {}
|
|
||||||
self.mx_map = {}
|
|
||||||
for atr, val in self.cfg.items():
|
|
||||||
# Verify each attribute of the structure
|
|
||||||
if atr.startswith("comment"):
|
|
||||||
continue
|
|
||||||
if atr == "author":
|
|
||||||
if type(val) not in [str, unicode]:
|
|
||||||
raise TypeError, "Author must be a string: " + `val`
|
|
||||||
elif atr == "timestamp":
|
|
||||||
self.timestamp = parse_timestamp(val)
|
|
||||||
elif atr == "expires":
|
|
||||||
self.expires = parse_timestamp(val)
|
|
||||||
elif atr == "tls-policies":
|
|
||||||
for domain, policies in self.check_tls_policy_domains(val):
|
|
||||||
if type(policies) != dict:
|
|
||||||
raise TypeError, domain + "'s policies should be a dict: " + `policies`
|
|
||||||
self.tls_policies[domain] = {} # being here enforces TLS at all
|
|
||||||
for policy, v in policies.items():
|
|
||||||
value = str(v).lower()
|
|
||||||
if policy == "require-tls":
|
|
||||||
if value in ("true", "1", "yes"):
|
|
||||||
self.tls_policies[domain]["required"] = True
|
|
||||||
elif value in ("false", "0", "no"):
|
|
||||||
self.tls_policies[domain]["required"] = False
|
|
||||||
else:
|
|
||||||
raise ValueError, "Unknown require-tls value " + `value`
|
|
||||||
elif policy == "min-tls-version":
|
|
||||||
reasonable = ["TLS", "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3"]
|
|
||||||
reasonable = map(string.lower, reasonable)
|
|
||||||
if not value in reasonable:
|
|
||||||
raise ValueError, "Not a valid TLS version string: " + `value`
|
|
||||||
self.tls_policies[domain]["min-tls-version"] = str(value)
|
|
||||||
elif policy == "enforce-mode":
|
|
||||||
if value == "enforce":
|
|
||||||
self.tls_policies[domain]["enforce"] = True
|
|
||||||
elif value == "log-only":
|
|
||||||
self.tls_policies[domain]["enforce"] = False
|
|
||||||
else:
|
|
||||||
raise ValueError, "Not a known enoforcement policy " + `value`
|
|
||||||
elif atr == "acceptable-mxs":
|
|
||||||
self.acceptable_mxs = val
|
|
||||||
self.mx_domain_to_address_domains = collections.defaultdict(set)
|
|
||||||
for address_domain, properties in self.acceptable_mxs.items():
|
|
||||||
mx_list = properties["accept-mx-domains"]
|
|
||||||
if len(mx_list) > 1:
|
|
||||||
print "Lists of multiple accept-mx-domains not yet supported, skipping ", address_domain
|
|
||||||
mx_domain = mx_list[0]
|
|
||||||
self.mx_domain_to_address_domains[mx_domain].add(address_domain)
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
sys.stderr.write("Unknown attribute: " + `atr` + "\n")
|
|
||||||
# XXX is it ever permissible to have a domain with an acceptable-mx
|
|
||||||
# that does not point to a TLS security policy? If not, check/warn/fail
|
|
||||||
# here
|
|
||||||
print self.tls_policies
|
|
||||||
|
|
||||||
def get_address_domains(self, mx_hostname):
|
|
||||||
labels = mx_hostname.split(".")
|
|
||||||
for n in range(1, len(labels)):
|
|
||||||
parent = "." + ".".join(labels[n:])
|
|
||||||
if parent in self.mx_domain_to_address_domains:
|
|
||||||
return self.mx_domain_to_address_domains[parent]
|
|
||||||
return None
|
|
||||||
|
|
||||||
def check_tls_policy_domains(self, val):
|
|
||||||
if type(val) != dict:
|
|
||||||
raise TypeError, "tls-policies should be a dict" + `val`
|
|
||||||
for domain, policies in val.items():
|
|
||||||
try:
|
|
||||||
assert type(domain) == unicode
|
|
||||||
d = str(domain) # convert from unicode
|
|
||||||
except:
|
|
||||||
raise TypeError, "tls-policy domain not a string" + `domain`
|
|
||||||
yield (d, policies)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
c = Config()
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from dateutil import parser as dateutil_parser
|
from dateutil import parser as dateutil_parser
|
||||||
import collections
|
import collections
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import string
|
import string
|
||||||
import os, os.path
|
import os, os.path
|
||||||
@@ -18,18 +17,14 @@ def parse_line(line_data):
|
|||||||
return None
|
return None
|
||||||
return (num, left.strip(), right.strip())
|
return (num, left.strip(), right.strip())
|
||||||
|
|
||||||
class MTAConfigGenerator:
|
|
||||||
def __init__(self, policy_config):
|
|
||||||
self.policy_config = policy_config
|
|
||||||
|
|
||||||
class ExistingConfigError(ValueError): pass
|
class ExistingConfigError(ValueError): pass
|
||||||
|
|
||||||
class PostfixConfigGenerator(MTAConfigGenerator):
|
class PostfixConfigGenerator:
|
||||||
def __init__(self, policy_config, postfix_dir, fixup=False):
|
def __init__(self, policy_config, postfix_dir, fixup=False):
|
||||||
self.fixup = fixup
|
self.fixup = fixup
|
||||||
self.postfix_dir = postfix_dir
|
self.postfix_dir = postfix_dir
|
||||||
self.policy_file = os.path.join(postfix_dir, "starttls_everywhere_policy")
|
self.policy_config = policy_config
|
||||||
MTAConfigGenerator.__init__(self, policy_config)
|
self.policy_file = os.path.join(postfix_dir, "starttls_everywhere_policy")
|
||||||
|
|
||||||
def ensure_cf_var(self, var, ideal, also_acceptable):
|
def ensure_cf_var(self, var, ideal, also_acceptable):
|
||||||
"""
|
"""
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python2.7
|
#!/usr/bin/env python
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import collections
|
import collections
|
||||||
Regular → Executable
+1
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
import copy
|
import copy
|
||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/env python
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import errno
|
import errno
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
Process Google's TLS delivery data from
|
Process Google's TLS delivery data from
|
||||||
https://www.google.com/transparencyreport/saferemail/data/?hl=en
|
https://www.google.com/transparencyreport/saferemail/data/?hl=en
|
||||||
Reference in New Issue
Block a user