Skip to content

Commit 0eb6721

Browse files
authored
Merge pull request #76 from telekom-mms/fix/indirect-json-access
fix: do not access object_data direct for future compatibility
2 parents 365dd25 + 43ed7b3 commit 0eb6721

15 files changed

Lines changed: 107 additions & 92 deletions

fortilib/address.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(self):
2121
def populate(self, object_data: dict):
2222
super().populate(object_data)
2323

24-
self.color = object_data["color"]
24+
self.color = object_data.get("color", self.color)
2525

2626

2727
class FortigateIpMask(FortigateAddress):
@@ -40,8 +40,8 @@ def populate(self, object_data: dict):
4040

4141
self.subnet = ipaddress.ip_network(
4242
"{}/{}".format(
43-
object_data["subnet"].split()[0],
44-
object_data["subnet"].split()[1],
43+
object_data.get("subnet", "0.0.0.0/0").split()[0],
44+
object_data.get("subnet", "0.0.0.0/0").split()[1],
4545
)
4646
)
4747

@@ -85,8 +85,12 @@ def __init__(self):
8585
def populate(self, object_data: dict):
8686
super().populate(object_data)
8787

88-
self.ip_start = ipaddress.ip_address(object_data["start-ip"])
89-
self.ip_end = ipaddress.ip_address(object_data["end-ip"])
88+
self.ip_start = ipaddress.ip_address(
89+
object_data.get("start-ip", self.ip_start)
90+
)
91+
self.ip_end = ipaddress.ip_address(
92+
object_data.get("end-ip", self.ip_end)
93+
)
9094

9195
def render(self) -> dict:
9296
"""Generate dict with all object arguments for fortigate api call.
@@ -129,7 +133,7 @@ def __init__(self):
129133
def populate(self, object_data: dict):
130134
super().populate(object_data)
131135

132-
self.fqdn = object_data["fqdn"]
136+
self.fqdn = object_data.get("fqdn", self.fqdn)
133137

134138
def render(self) -> dict:
135139
"""Generate dict with all object arguments for fortigate api call.

fortilib/base.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@ def populate(self, object_data: dict):
2727
"""
2828

2929
self.object_data = object_data
30-
self.comment = (
31-
object_data["comment"] if "comment" in object_data else ""
32-
)
30+
self.comment = object_data.get("comment", self.comment)
3331

3432
def render(self) -> dict:
3533
"""Generate dict with all object arguments for fortigate api call.
@@ -60,7 +58,7 @@ def __init__(self):
6058
def populate(self, object_data: dict):
6159
"""Generate dict with all object arguments for fortigate api call."""
6260
super().populate(object_data)
63-
self.name = object_data["name"]
61+
self.name = object_data.get("name", self.name)
6462

6563
def __eq__(self, other):
6664
if isinstance(other, FortigateNamedObject):

fortilib/interface.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ def __eq__(self, other):
2929
def populate(self, object_data: dict):
3030
super().populate(object_data)
3131

32-
self.alias = object_data["alias"]
32+
self.alias = object_data.get("alias", self.alias)
3333
self.ip = ipaddress.ip_interface(
3434
"{}/{}".format(
35-
object_data["ip"].split()[0],
36-
object_data["ip"].split()[1],
35+
object_data.get("ip", "0.0.0.0/0").split()[0],
36+
object_data.get("ip", "0.0.0.0/0").split()[1],
3737
)
3838
)
3939

fortilib/ippool.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,18 @@ def __init__(self):
3030
def populate(self, object_data: dict):
3131
super().populate(object_data)
3232

33-
self.comment = object_data["comments"]
34-
self.type = object_data["type"]
35-
self.startip = ipaddress.ip_address(object_data["startip"])
36-
self.endip = ipaddress.ip_address(object_data["endip"])
33+
self.comment = object_data.get("comments", self.comment)
34+
self.type = object_data.get("type", self.type)
35+
self.startip = ipaddress.ip_address(
36+
object_data.get("startip", self.startip)
37+
)
38+
self.endip = ipaddress.ip_address(object_data.get("endip", self.endip))
3739
self.source_startip = ipaddress.ip_address(
38-
object_data["source-startip"]
40+
object_data.get("source-startip", "0.0.0.0")
41+
)
42+
self.source_endip = ipaddress.ip_address(
43+
object_data.get("source-endip", "0.0.0.0")
3944
)
40-
self.source_endip = ipaddress.ip_address(object_data["source-endip"])
4145

4246
def render(self) -> dict:
4347
"""Generate dict with all object arguments for fortigate api call.

fortilib/mixins/group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class FortigateGroupMixin:
77
def find_member(self, search_lists: List[List]):
8-
for member_raw in self.object_data["member"]:
8+
for member_raw in self.object_data.get("member", []):
99
member = None
1010
for search_list in search_lists:
1111
member = get_by("name", member_raw["name"], search_list)

fortilib/mixins/interface.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ class FortigateInterfaceMixin:
77
interface_attribute: str = "interface"
88

99
def find_interface(self, interfaces: List[FortigateInterface]):
10-
if (
11-
self.interface_attribute not in self.object_data
12-
or self.object_data[self.interface_attribute] == ""
13-
or self.object_data[self.interface_attribute] == "any"
14-
):
10+
if self.object_data.get(self.interface_attribute, "") in ("", "any"):
1511
return
1612

1713
for interface in interfaces:
18-
if interface.name == self.object_data[self.interface_attribute]:
14+
if interface.name == self.object_data.get(
15+
self.interface_attribute
16+
):
1917
self.interface = interface
2018
break

fortilib/policy.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,27 +74,32 @@ def __eq__(self, other):
7474
def populate(self, object_data: dict):
7575
super().populate(object_data)
7676

77-
self.policyid = object_data["policyid"]
78-
self.action = FortigatePolicyAction[object_data["action"].upper()]
79-
self.nat = object_data["nat"]
80-
self.ippool = object_data["ippool"]
77+
self.policyid = object_data.get("policyid", self.policyid)
78+
self.action = FortigatePolicyAction[
79+
object_data.get(
80+
"action", FortigatePolicyAction.ACCEPT.value
81+
).upper()
82+
]
83+
self.nat = object_data.get("nat", self.nat)
84+
self.ippool = object_data.get("ippool", self.ippool)
8185

82-
self.schedule = object_data["schedule"]
86+
self.schedule = object_data.get("schedule", self.schedule)
8387

84-
if "logtraffic" in object_data:
85-
self.logtraffic = FortigatePolicyLogTraffic[
86-
object_data["logtraffic"].upper()
87-
]
88+
self.logtraffic = FortigatePolicyLogTraffic[
89+
object_data.get(
90+
"logtraffic", FortigatePolicyLogTraffic.ALL.value
91+
).upper()
92+
]
8893

89-
self.comment = object_data["comments"]
94+
self.comment = object_data.get("comments", self.comment)
9095

9196
def find_interfaces(self, interfaces: List[FortigateInterface]):
9297
self.srcintf = self.find_interface_for(
93-
self.object_data["srcintf"],
98+
self.object_data.get("srcintf"),
9499
interfaces,
95100
)
96101
self.dstintf = self.find_interface_for(
97-
self.object_data["dstintf"],
102+
self.object_data.get("dstintf"),
98103
interfaces,
99104
)
100105

@@ -117,11 +122,11 @@ def find_interface_for(
117122

118123
def find_addresses(self, addresses: List[List[FortigateAddress]]):
119124
self.srcaddr = self.find_addresses_for(
120-
self.object_data["srcaddr"],
125+
self.object_data.get("srcaddr"),
121126
addresses,
122127
)
123128
self.dstaddr = self.find_addresses_for(
124-
self.object_data["dstaddr"],
129+
self.object_data.get("dstaddr"),
125130
addresses,
126131
)
127132

@@ -153,7 +158,7 @@ def find_services(
153158
Union[List[FortigateService], List[FortigateServiceGroup]]
154159
],
155160
):
156-
for service_dict in self.object_data["service"]:
161+
for service_dict in self.object_data.get("service", []):
157162
service = None
158163
for search_list in all_services:
159164
service = get_by("name", service_dict["name"], search_list)
@@ -167,7 +172,7 @@ def find_services(
167172
self.service.append(service)
168173

169174
def find_ippools(self, all_ippools: List[FortigateIPPool]):
170-
for ippool_dict in self.object_data["poolname"]:
175+
for ippool_dict in self.object_data.get("poolname", []):
171176
ippool = get_by("name", ippool_dict["name"], all_ippools)
172177
if ippool is None:
173178
raise Exception(

fortilib/proxyaddress.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def __init__(self):
2424
def populate(self, object_data: dict):
2525
super().populate(object_data)
2626

27-
self.host_regex = object_data["host-regex"]
27+
self.host_regex = object_data.get("host-regex", self.host_regex)
2828

2929
def render(self) -> dict:
3030
return {
@@ -45,7 +45,7 @@ def __init__(self):
4545
def populate(self, object_data: dict):
4646
super().populate(object_data)
4747

48-
self.path = object_data["path"]
48+
self.path = object_data.get("path", self.path)
4949

5050
def render(self) -> dict:
5151
return {
@@ -61,7 +61,7 @@ def find_host(
6161
hosts: List[Union[FortigateAddress, FortigateProxyAddressHostRegex]],
6262
):
6363
for host in hosts:
64-
if host.name == self.object_data["host"] and isinstance(
64+
if host.name == self.object_data.get("host") and isinstance(
6565
host, FortigateProxyAddressHostRegex
6666
):
6767
self.host = host

fortilib/proxyaddressgroup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __init__(self):
2323
# TODO mabye not needed because super-element FortigateNamedObject implements it already -> delete?!
2424
def populate(self, object_data: dict):
2525
super().populate(object_data)
26-
self.type = object_data["type"]
26+
self.type = object_data.get("type", self.type)
2727

2828
def render(self) -> dict:
2929
"""Generate dict with all object arguments for fortigate api call.

fortilib/proxypolicy.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,27 @@ def __init__(self):
5252
def populate(self, object_data: dict):
5353
super().populate(object_data)
5454

55-
self.policyid = object_data["policyid"]
56-
self.action = object_data["action"]
57-
self.status = object_data["status"]
58-
59-
self.schedule = object_data["schedule"]
60-
self.proxy = object_data["proxy"]
61-
self.logtraffic = object_data["logtraffic"]
62-
self.utm_status = object_data["utm-status"]
63-
self.profile_type = object_data["profile-type"]
64-
self.profile_group = object_data["profile-group"]
65-
self.comment = object_data["comments"]
55+
self.policyid = object_data.get("policyid", self.policyid)
56+
self.action = object_data.get("action", self.action)
57+
self.status = object_data.get("status", self.status)
58+
59+
self.schedule = object_data.get("schedule", self.schedule)
60+
self.proxy = object_data.get("proxy", self.proxy)
61+
self.logtraffic = object_data.get("logtraffic", self.logtraffic)
62+
self.utm_status = object_data.get("utm-status", self.utm_status)
63+
self.profile_type = object_data.get("profile-type", self.profile_type)
64+
self.profile_group = object_data.get(
65+
"profile-group", self.profile_group
66+
)
67+
self.comment = object_data.get("comments", self.comment)
6668

6769
def find_interfaces(self, interfaces: List[FortigateInterface]):
6870
self.srcintf = self.find_interface_for(
69-
self.object_data["srcintf"],
71+
self.object_data.get("srcintf"),
7072
interfaces,
7173
)
7274
self.dstintf = self.find_interface_for(
73-
self.object_data["dstintf"],
75+
self.object_data.get("dstintf"),
7476
interfaces,
7577
)
7678

@@ -96,11 +98,11 @@ def find_addresses(
9698
addresses: List[List[Union[FortigateAddress, FortigateProxyAddress]]],
9799
):
98100
self.srcaddr = self.find_addresses_for(
99-
self.object_data["srcaddr"],
101+
self.object_data.get("srcaddr"),
100102
addresses,
101103
)
102104
self.dstaddr = self.find_addresses_for(
103-
self.object_data["dstaddr"],
105+
self.object_data.get("dstaddr"),
104106
addresses,
105107
)
106108

@@ -135,7 +137,7 @@ def find_services(
135137
Union[List[FortigateService], List[FortigateServiceGroup]]
136138
],
137139
):
138-
for service_dict in self.object_data["service"]:
140+
for service_dict in self.object_data.get("service", []):
139141
service = None
140142
for search_list in all_services:
141143
service = get_by("name", service_dict["name"], search_list)

0 commit comments

Comments
 (0)