Skip to content
This repository was archived by the owner on Nov 22, 2024. It is now read-only.

Commit 1a684ae

Browse files
committed
rewrite of config file to bring up to spec and to allow for per-method auth values
1 parent 8981db6 commit 1a684ae

3 files changed

Lines changed: 159 additions & 105 deletions

File tree

CloudFlare/api_extras.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def api_extras(self, extras=None):
3737
api_call_part1 = '/'.join(element_path)
3838
api_call_part2 = '/'.join(parts[1])
3939
setattr(m, parts[1][0],
40-
self._add_with_auth(self._base, api_call_part1, api_call_part2))
40+
self._AddWithAuth(self._base, api_call_part1, api_call_part2))
4141
current = m
4242
continue
4343
except:
@@ -48,9 +48,9 @@ def api_extras(self, extras=None):
4848
api_call_part1 = '/'.join(element_path)
4949
api_call_part2 = '/'.join(parts[1])
5050
setattr(current, element,
51-
self._add_with_auth(self._base, api_call_part1, api_call_part2))
51+
self._AddWithAuth(self._base, api_call_part1, api_call_part2))
5252
else:
5353
api_call_part1 = '/'.join(element_path)
5454
setattr(current, element,
55-
self._add_with_auth(self._base, api_call_part1))
55+
self._AddWithAuth(self._base, api_call_part1))
5656
current = getattr(current, element)

CloudFlare/cloudflare.py

Lines changed: 97 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,32 @@ class CloudFlare(object):
1919
class _v4base(object):
2020
""" Cloudflare v4 API"""
2121

22-
def __init__(self, email, token, certtoken, base_url, debug, raw, use_sessions, profile):
22+
def __init__(self, config):
2323
""" Cloudflare v4 API"""
2424

25-
self.email = email
26-
self.token = token
27-
self.certtoken = certtoken
28-
self.base_url = base_url
29-
self.raw = raw
30-
self.use_sessions = use_sessions
31-
self.profile = profile
25+
self.config = config
26+
if 'email' in config:
27+
self.email = config['email']
28+
else:
29+
self.email = None
30+
if 'token' in config:
31+
self.token = config['token']
32+
else:
33+
self.token = None
34+
if 'certtoken' in config:
35+
self.certtoken = config['certtoken']
36+
else:
37+
self.certtoken = None
38+
39+
self.base_url = config['base_url']
40+
self.raw = config['raw']
41+
self.use_sessions = config['use_sessions']
42+
self.profile = config['profile']
3243
self.session = None
3344
self.user_agent = user_agent()
3445

35-
if debug:
36-
self.logger = CFlogger(debug).getLogger()
46+
if 'debug' in config and config['debug']:
47+
self.logger = CFlogger(config['debug']).getLogger()
3748
else:
3849
self.logger = None
3950

@@ -43,42 +54,62 @@ def call_with_no_auth(self, method, parts,
4354
""" Cloudflare v4 API"""
4455

4556
headers = {}
46-
self._add_headers(headers)
57+
self._AddHeaders(headers)
4758
return self._call(method, headers, parts,
4859
identifier1, identifier2, identifier3,
4960
params, data, files)
5061

51-
def _add_headers(self, headers):
62+
def _AddHeaders(self, headers):
5263
""" Add default headers """
5364
headers['User-Agent'] = self.user_agent
5465
headers['Content-Type'] = 'application/json'
5566

56-
def _add_auth_headers(self, headers):
67+
def _AddAuthHeaders(self, headers, method):
5768
""" Add authentication headers """
58-
if self.email is None and self.token is None:
69+
70+
v = 'email' + '.' + method.lower()
71+
if v in self.config:
72+
email = self.config[v] # use specific value for this method
73+
else:
74+
email = self.email # use generic value for all methods
75+
76+
v = 'token' + '.' + method.lower()
77+
if v in self.config:
78+
token = self.config[v] # use specific value for this method
79+
else:
80+
token = self.token # use generic value for all methods
81+
82+
if email is None and token is None:
5983
raise CloudFlareAPIError(0, 'no email and no token defined')
60-
if self.token is None:
84+
if token is None:
6185
raise CloudFlareAPIError(0, 'no token defined')
62-
if self.email is None:
63-
headers['Authorization'] = 'Bearer %s' % (self.token)
86+
if email is None:
87+
headers['Authorization'] = 'Bearer %s' % (token)
6488
else:
65-
headers['X-Auth-Email'] = self.email
66-
headers['X-Auth-Key'] = self.token
89+
headers['X-Auth-Email'] = email
90+
headers['X-Auth-Key'] = token
6791

68-
def _add_certtoken_headers(self, headers):
92+
def _AddCerttokenHeaders(self, headers, method):
6993
""" Add authentication headers """
70-
if self.certtoken is None:
94+
95+
v = 'certtoken' + '.' + method.lower()
96+
if v in self.config:
97+
certtoken = self.config[v] # use specific value for this method
98+
else:
99+
certtoken = self.certtoken # use generic value for all methods
100+
101+
if certtoken is None:
71102
raise CloudFlareAPIError(0, 'no cert token defined')
72-
headers['X-Auth-User-Service-Key'] = self.certtoken
103+
headers['X-Auth-User-Service-Key'] = certtoken
73104

74105
def call_with_auth(self, method, parts,
75106
identifier1=None, identifier2=None, identifier3=None,
76107
params=None, data=None, files=None):
77108
""" Cloudflare v4 API"""
78109

79110
headers = {}
80-
self._add_headers(headers)
81-
self._add_auth_headers(headers)
111+
self._AddHeaders(headers)
112+
self._AddAuthHeaders(headers, method)
82113
if isinstance(data, str):
83114
# passing javascript vs JSON
84115
headers['Content-Type'] = 'application/javascript'
@@ -97,8 +128,8 @@ def call_with_auth_unwrapped(self, method, parts,
97128
""" Cloudflare v4 API"""
98129

99130
headers = {}
100-
self._add_headers(headers)
101-
self._add_auth_headers(headers)
131+
self._AddHeaders(headers)
132+
self._AddAuthHeaders(headers, method)
102133
if isinstance(data, str):
103134
# passing javascript vs JSON
104135
headers['Content-Type'] = 'application/javascript'
@@ -117,8 +148,8 @@ def call_with_certauth(self, method, parts,
117148
""" Cloudflare v4 API"""
118149

119150
headers = {}
120-
self._add_headers(headers)
121-
self._add_certtoken_headers(headers)
151+
self._AddHeaders(headers)
152+
self._AddCerttokenHeaders(headers, method)
122153
return self._call(method, headers, parts,
123154
identifier1, identifier2, identifier3,
124155
params, data, files)
@@ -506,7 +537,7 @@ def _call_unwrapped(self, method, headers, parts,
506537
result = response_data
507538
return result
508539

509-
class _add_unused(object):
540+
class _AddUnused(object):
510541
""" Cloudflare v4 API"""
511542

512543
def __init__(self, base, p1, p2=None, p3=None):
@@ -551,7 +582,7 @@ def delete(self, identifier1=None, identifier2=None, identifier3=None, params=No
551582

552583
raise CloudFlareAPIError(0, 'delete() call not available for this endpoint')
553584

554-
class _add_noauth(object):
585+
class _AddNoAuth(object):
555586
""" Cloudflare v4 API"""
556587

557588
def __init__(self, base, p1, p2=None, p3=None):
@@ -598,7 +629,7 @@ def delete(self, identifier1=None, identifier2=None, identifier3=None, params=No
598629

599630
raise CloudFlareAPIError(0, 'delete() call not available for this endpoint')
600631

601-
class _add_with_auth(object):
632+
class _AddWithAuth(object):
602633
""" Cloudflare v4 API"""
603634

604635
def __init__(self, base, p1, p2=None, p3=None):
@@ -653,7 +684,7 @@ def delete(self, identifier1=None, identifier2=None, identifier3=None, params=No
653684
identifier1, identifier2, identifier3,
654685
params, data)
655686

656-
class _add_with_auth_unwrapped(object):
687+
class _AddWithAuthUnwrapped(object):
657688
""" Cloudflare v4 API"""
658689

659690
def __init__(self, base, p1, p2=None, p3=None):
@@ -708,7 +739,7 @@ def delete(self, identifier1=None, identifier2=None, identifier3=None, params=No
708739
identifier1, identifier2, identifier3,
709740
params, data)
710741

711-
class _add_with_cert_auth(object):
742+
class _AddWithCertAuth(object):
712743
""" Cloudflare v4 API"""
713744

714745
def __init__(self, base, p1, p2=None, p3=None):
@@ -784,15 +815,15 @@ def add(self, t, p1, p2=None, p3=None):
784815
name = a[-1]
785816

786817
if t == 'VOID':
787-
f = self._add_unused(self._base, p1, p2, p3)
818+
f = self._AddUnused(self._base, p1, p2, p3)
788819
elif t == 'OPEN':
789-
f = self._add_noauth(self._base, p1, p2, p3)
820+
f = self._AddNoAuth(self._base, p1, p2, p3)
790821
elif t == 'AUTH':
791-
f = self._add_with_auth(self._base, p1, p2, p3)
822+
f = self._AddWithAuth(self._base, p1, p2, p3)
792823
elif t == 'CERT':
793-
f = self._add_with_cert_auth(self._base, p1, p2, p3)
824+
f = self._AddWithCertAuth(self._base, p1, p2, p3)
794825
elif t == 'AUTH_UNWRAPPED':
795-
f = self._add_with_auth_unwrapped(self._base, p1, p2, p3)
826+
f = self._AddWithAuthUnwrapped(self._base, p1, p2, p3)
796827
else:
797828
# should never happen
798829
raise CloudFlareAPIError(0, 'api load type mismatch')
@@ -827,31 +858,41 @@ def __init__(self, email=None, token=None, certtoken=None, debug=False, raw=Fals
827858

828859
base_url = BASE_URL
829860

830-
# class creation values override configuration values
831861
try:
832-
[conf_email, conf_token, conf_certtoken, extras, profile] = read_configs(profile)
862+
config = read_configs(profile)
833863
except:
834864
raise CloudFlareAPIError(0, 'profile/configuration read error')
835865

836-
if email is None:
837-
email = conf_email
838-
if token is None:
839-
token = conf_token
840-
if certtoken is None:
841-
certtoken = conf_certtoken
842-
843-
if email == '':
844-
email = None
845-
if token == '':
846-
token = None
847-
if certtoken == '':
848-
certtoken = None
849-
self._base = self._v4base(email, token, certtoken, base_url, debug, raw, use_sessions, profile)
866+
# class creation values override all configuration values
867+
if email is not None:
868+
config['email'] = email
869+
if token is not None:
870+
config['token'] = token
871+
if certtoken is not None:
872+
config['certtoken'] = certtoken
873+
if base_url is not None:
874+
config['base_url'] = base_url
875+
if debug is not None:
876+
config['debug'] = debug
877+
if raw is not None:
878+
config['raw'] = raw
879+
if use_sessions is not None:
880+
config['use_sessions'] = use_sessions
881+
if profile is not None:
882+
config['profile'] = profile
883+
884+
# we do not need to handle item.call values - they pass straight thru
885+
886+
for x in config:
887+
if config[x] == '':
888+
config[x] = None
889+
890+
self._base = self._v4base(config)
850891

851892
# add the API calls
852893
api_v4(self)
853-
if extras:
854-
api_extras(self, extras)
894+
if 'extras' in config and config['extras']:
895+
api_extras(self, config['extras'])
855896

856897
def __call__(self):
857898
""" Cloudflare v4 API"""

0 commit comments

Comments
 (0)