Skip to content

Commit 0464dac

Browse files
Fixes: #16292 - Properly restrict GraphQL queries for querys with pk set (#17244)
* Fixes: #16292 - Properly restrict GraphQL queries for querys with pk set * Update netbox/netbox/settings.py * Apply schema adaptations across all apps * Extend GraphQL API tests --------- Co-authored-by: Jeremy Stretch <[email protected]>
1 parent cf62178 commit 0464dac

File tree

14 files changed

+171
-352
lines changed

14 files changed

+171
-352
lines changed

netbox/circuits/graphql/schema.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,25 @@
33
import strawberry
44
import strawberry_django
55

6-
from circuits import models
76
from .types import *
87

98

10-
@strawberry.type
9+
@strawberry.type(name="Query")
1110
class CircuitsQuery:
12-
@strawberry.field
13-
def circuit(self, id: int) -> CircuitType:
14-
return models.Circuit.objects.get(pk=id)
11+
circuit: CircuitType = strawberry_django.field()
1512
circuit_list: List[CircuitType] = strawberry_django.field()
1613

17-
@strawberry.field
18-
def circuit_termination(self, id: int) -> CircuitTerminationType:
19-
return models.CircuitTermination.objects.get(pk=id)
14+
circuit_termination: CircuitTerminationType = strawberry_django.field()
2015
circuit_termination_list: List[CircuitTerminationType] = strawberry_django.field()
2116

22-
@strawberry.field
23-
def circuit_type(self, id: int) -> CircuitTypeType:
24-
return models.CircuitType.objects.get(pk=id)
17+
circuit_type: CircuitTypeType = strawberry_django.field()
2518
circuit_type_list: List[CircuitTypeType] = strawberry_django.field()
2619

27-
@strawberry.field
28-
def provider(self, id: int) -> ProviderType:
29-
return models.Provider.objects.get(pk=id)
20+
provider: ProviderType = strawberry_django.field()
3021
provider_list: List[ProviderType] = strawberry_django.field()
3122

32-
@strawberry.field
33-
def provider_account(self, id: int) -> ProviderAccountType:
34-
return models.ProviderAccount.objects.get(pk=id)
23+
provider_account: ProviderAccountType = strawberry_django.field()
3524
provider_account_list: List[ProviderAccountType] = strawberry_django.field()
3625

37-
@strawberry.field
38-
def provider_network(self, id: int) -> ProviderNetworkType:
39-
return models.ProviderNetwork.objects.get(pk=id)
26+
provider_network: ProviderNetworkType = strawberry_django.field()
4027
provider_network_list: List[ProviderNetworkType] = strawberry_django.field()

netbox/core/graphql/schema.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,13 @@
33
import strawberry
44
import strawberry_django
55

6-
from core import models
76
from .types import *
87

98

10-
@strawberry.type
9+
@strawberry.type(name="Query")
1110
class CoreQuery:
12-
@strawberry.field
13-
def data_file(self, id: int) -> DataFileType:
14-
return models.DataFile.objects.get(pk=id)
11+
data_file: DataFileType = strawberry_django.field()
1512
data_file_list: List[DataFileType] = strawberry_django.field()
1613

17-
@strawberry.field
18-
def data_source(self, id: int) -> DataSourceType:
19-
return models.DataSource.objects.get(pk=id)
14+
data_source: DataSourceType = strawberry_django.field()
2015
data_source_list: List[DataSourceType] = strawberry_django.field()

netbox/dcim/graphql/schema.py

Lines changed: 41 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -3,208 +3,127 @@
33
import strawberry
44
import strawberry_django
55

6-
from dcim import models
76
from .types import *
87

98

10-
@strawberry.type
9+
@strawberry.type(name="Query")
1110
class DCIMQuery:
12-
@strawberry.field
13-
def cable(self, id: int) -> CableType:
14-
return models.Cable.objects.get(pk=id)
11+
cable: CableType = strawberry_django.field()
1512
cable_list: List[CableType] = strawberry_django.field()
1613

17-
@strawberry.field
18-
def console_port(self, id: int) -> ConsolePortType:
19-
return models.ConsolePort.objects.get(pk=id)
14+
console_port: ConsolePortType = strawberry_django.field()
2015
console_port_list: List[ConsolePortType] = strawberry_django.field()
2116

22-
@strawberry.field
23-
def console_port_template(self, id: int) -> ConsolePortTemplateType:
24-
return models.ConsolePortTemplate.objects.get(pk=id)
17+
console_port_template: ConsolePortTemplateType = strawberry_django.field()
2518
console_port_template_list: List[ConsolePortTemplateType] = strawberry_django.field()
2619

27-
@strawberry.field
28-
def console_server_port(self, id: int) -> ConsoleServerPortType:
29-
return models.ConsoleServerPort.objects.get(pk=id)
20+
console_server_port: ConsoleServerPortType = strawberry_django.field()
3021
console_server_port_list: List[ConsoleServerPortType] = strawberry_django.field()
3122

32-
@strawberry.field
33-
def console_server_port_template(self, id: int) -> ConsoleServerPortTemplateType:
34-
return models.ConsoleServerPortTemplate.objects.get(pk=id)
23+
console_server_port_template: ConsoleServerPortTemplateType = strawberry_django.field()
3524
console_server_port_template_list: List[ConsoleServerPortTemplateType] = strawberry_django.field()
3625

37-
@strawberry.field
38-
def device(self, id: int) -> DeviceType:
39-
return models.Device.objects.get(pk=id)
26+
device: DeviceType = strawberry_django.field()
4027
device_list: List[DeviceType] = strawberry_django.field()
4128

42-
@strawberry.field
43-
def device_bay(self, id: int) -> DeviceBayType:
44-
return models.DeviceBay.objects.get(pk=id)
29+
device_bay: DeviceBayType = strawberry_django.field()
4530
device_bay_list: List[DeviceBayType] = strawberry_django.field()
4631

47-
@strawberry.field
48-
def device_bay_template(self, id: int) -> DeviceBayTemplateType:
49-
return models.DeviceBayTemplate.objects.get(pk=id)
32+
device_bay_template: DeviceBayTemplateType = strawberry_django.field()
5033
device_bay_template_list: List[DeviceBayTemplateType] = strawberry_django.field()
5134

52-
@strawberry.field
53-
def device_role(self, id: int) -> DeviceRoleType:
54-
return models.DeviceRole.objects.get(pk=id)
35+
device_role: DeviceRoleType = strawberry_django.field()
5536
device_role_list: List[DeviceRoleType] = strawberry_django.field()
5637

57-
@strawberry.field
58-
def device_type(self, id: int) -> DeviceTypeType:
59-
return models.DeviceType.objects.get(pk=id)
38+
device_type: DeviceTypeType = strawberry_django.field()
6039
device_type_list: List[DeviceTypeType] = strawberry_django.field()
6140

62-
@strawberry.field
63-
def front_port(self, id: int) -> FrontPortType:
64-
return models.FrontPort.objects.get(pk=id)
41+
front_port: FrontPortType = strawberry_django.field()
6542
front_port_list: List[FrontPortType] = strawberry_django.field()
6643

67-
@strawberry.field
68-
def front_port_template(self, id: int) -> FrontPortTemplateType:
69-
return models.FrontPortTemplate.objects.get(pk=id)
44+
front_port_template: FrontPortTemplateType = strawberry_django.field()
7045
front_port_template_list: List[FrontPortTemplateType] = strawberry_django.field()
7146

72-
@strawberry.field
73-
def interface(self, id: int) -> InterfaceType:
74-
return models.Interface.objects.get(pk=id)
47+
interface: InterfaceType = strawberry_django.field()
7548
interface_list: List[InterfaceType] = strawberry_django.field()
7649

77-
@strawberry.field
78-
def interface_template(self, id: int) -> InterfaceTemplateType:
79-
return models.InterfaceTemplate.objects.get(pk=id)
50+
interface_template: InterfaceTemplateType = strawberry_django.field()
8051
interface_template_list: List[InterfaceTemplateType] = strawberry_django.field()
8152

82-
@strawberry.field
83-
def inventory_item(self, id: int) -> InventoryItemType:
84-
return models.InventoryItem.objects.get(pk=id)
53+
inventory_item: InventoryItemType = strawberry_django.field()
8554
inventory_item_list: List[InventoryItemType] = strawberry_django.field()
8655

87-
@strawberry.field
88-
def inventory_item_role(self, id: int) -> InventoryItemRoleType:
89-
return models.InventoryItemRole.objects.get(pk=id)
56+
inventory_item_role: InventoryItemRoleType = strawberry_django.field()
9057
inventory_item_role_list: List[InventoryItemRoleType] = strawberry_django.field()
9158

92-
@strawberry.field
93-
def inventory_item_template(self, id: int) -> InventoryItemTemplateType:
94-
return models.InventoryItemTemplate.objects.get(pk=id)
59+
inventory_item_template: InventoryItemTemplateType = strawberry_django.field()
9560
inventory_item_template_list: List[InventoryItemTemplateType] = strawberry_django.field()
9661

97-
@strawberry.field
98-
def location(self, id: int) -> LocationType:
99-
return models.Location.objects.get(pk=id)
62+
location: LocationType = strawberry_django.field()
10063
location_list: List[LocationType] = strawberry_django.field()
10164

102-
@strawberry.field
103-
def manufacturer(self, id: int) -> ManufacturerType:
104-
return models.Manufacturer.objects.get(pk=id)
65+
manufacturer: ManufacturerType = strawberry_django.field()
10566
manufacturer_list: List[ManufacturerType] = strawberry_django.field()
10667

107-
@strawberry.field
108-
def module(self, id: int) -> ModuleType:
109-
return models.Module.objects.get(pk=id)
68+
module: ModuleType = strawberry_django.field()
11069
module_list: List[ModuleType] = strawberry_django.field()
11170

112-
@strawberry.field
113-
def module_bay(self, id: int) -> ModuleBayType:
114-
return models.ModuleBay.objects.get(pk=id)
71+
module_bay: ModuleBayType = strawberry_django.field()
11572
module_bay_list: List[ModuleBayType] = strawberry_django.field()
11673

117-
@strawberry.field
118-
def module_bay_template(self, id: int) -> ModuleBayTemplateType:
119-
return models.ModuleBayTemplate.objects.get(pk=id)
74+
module_bay_template: ModuleBayTemplateType = strawberry_django.field()
12075
module_bay_template_list: List[ModuleBayTemplateType] = strawberry_django.field()
12176

122-
@strawberry.field
123-
def module_type(self, id: int) -> ModuleTypeType:
124-
return models.ModuleType.objects.get(pk=id)
77+
module_type: ModuleTypeType = strawberry_django.field()
12578
module_type_list: List[ModuleTypeType] = strawberry_django.field()
12679

127-
@strawberry.field
128-
def platform(self, id: int) -> PlatformType:
129-
return models.Platform.objects.get(pk=id)
80+
platform: PlatformType = strawberry_django.field()
13081
platform_list: List[PlatformType] = strawberry_django.field()
13182

132-
@strawberry.field
133-
def power_feed(self, id: int) -> PowerFeedType:
134-
return models.PowerFeed.objects.get(pk=id)
83+
power_feed: PowerFeedType = strawberry_django.field()
13584
power_feed_list: List[PowerFeedType] = strawberry_django.field()
13685

137-
@strawberry.field
138-
def power_outlet(self, id: int) -> PowerOutletType:
139-
return models.PowerOutlet.objects.get(pk=id)
86+
power_outlet: PowerOutletType = strawberry_django.field()
14087
power_outlet_list: List[PowerOutletType] = strawberry_django.field()
14188

142-
@strawberry.field
143-
def power_outlet_template(self, id: int) -> PowerOutletTemplateType:
144-
return models.PowerOutletTemplate.objects.get(pk=id)
89+
power_outlet_template: PowerOutletTemplateType = strawberry_django.field()
14590
power_outlet_template_list: List[PowerOutletTemplateType] = strawberry_django.field()
14691

147-
@strawberry.field
148-
def power_panel(self, id: int) -> PowerPanelType:
149-
return models.PowerPanel.objects.get(id=id)
92+
power_panel: PowerPanelType = strawberry_django.field()
15093
power_panel_list: List[PowerPanelType] = strawberry_django.field()
15194

152-
@strawberry.field
153-
def power_port(self, id: int) -> PowerPortType:
154-
return models.PowerPort.objects.get(id=id)
95+
power_port: PowerPortType = strawberry_django.field()
15596
power_port_list: List[PowerPortType] = strawberry_django.field()
15697

157-
@strawberry.field
158-
def power_port_template(self, id: int) -> PowerPortTemplateType:
159-
return models.PowerPortTemplate.objects.get(id=id)
98+
power_port_template: PowerPortTemplateType = strawberry_django.field()
16099
power_port_template_list: List[PowerPortTemplateType] = strawberry_django.field()
161100

162-
@strawberry.field
163-
def rack(self, id: int) -> RackType:
164-
return models.Rack.objects.get(id=id)
101+
rack: RackType = strawberry_django.field()
165102
rack_list: List[RackType] = strawberry_django.field()
166103

167-
@strawberry.field
168-
def rack_reservation(self, id: int) -> RackReservationType:
169-
return models.RackReservation.objects.get(id=id)
104+
rack_reservation: RackReservationType = strawberry_django.field()
170105
rack_reservation_list: List[RackReservationType] = strawberry_django.field()
171106

172-
@strawberry.field
173-
def rack_role(self, id: int) -> RackRoleType:
174-
return models.RackRole.objects.get(id=id)
107+
rack_role: RackRoleType = strawberry_django.field()
175108
rack_role_list: List[RackRoleType] = strawberry_django.field()
176109

177-
@strawberry.field
178-
def rear_port(self, id: int) -> RearPortType:
179-
return models.RearPort.objects.get(id=id)
110+
rear_port: RearPortType = strawberry_django.field()
180111
rear_port_list: List[RearPortType] = strawberry_django.field()
181112

182-
@strawberry.field
183-
def rear_port_template(self, id: int) -> RearPortTemplateType:
184-
return models.RearPortTemplate.objects.get(id=id)
113+
rear_port_template: RearPortTemplateType = strawberry_django.field()
185114
rear_port_template_list: List[RearPortTemplateType] = strawberry_django.field()
186115

187-
@strawberry.field
188-
def region(self, id: int) -> RegionType:
189-
return models.Region.objects.get(id=id)
116+
region: RegionType = strawberry_django.field()
190117
region_list: List[RegionType] = strawberry_django.field()
191118

192-
@strawberry.field
193-
def site(self, id: int) -> SiteType:
194-
return models.Site.objects.get(id=id)
119+
site: SiteType = strawberry_django.field()
195120
site_list: List[SiteType] = strawberry_django.field()
196121

197-
@strawberry.field
198-
def site_group(self, id: int) -> SiteGroupType:
199-
return models.SiteGroup.objects.get(id=id)
122+
site_group: SiteGroupType = strawberry_django.field()
200123
site_group_list: List[SiteGroupType] = strawberry_django.field()
201124

202-
@strawberry.field
203-
def virtual_chassis(self, id: int) -> VirtualChassisType:
204-
return models.VirtualChassis.objects.get(id=id)
125+
virtual_chassis: VirtualChassisType = strawberry_django.field()
205126
virtual_chassis_list: List[VirtualChassisType] = strawberry_django.field()
206127

207-
@strawberry.field
208-
def virtual_device_context(self, id: int) -> VirtualDeviceContextType:
209-
return models.VirtualDeviceContext.objects.get(id=id)
128+
virtual_device_context: VirtualDeviceContextType = strawberry_django.field()
210129
virtual_device_context_list: List[VirtualDeviceContextType] = strawberry_django.field()

netbox/extras/graphql/schema.py

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,68 +3,43 @@
33
import strawberry
44
import strawberry_django
55

6-
from extras import models
76
from .types import *
87

98

10-
@strawberry.type
9+
@strawberry.type(name="Query")
1110
class ExtrasQuery:
12-
@strawberry.field
13-
def config_context(self, id: int) -> ConfigContextType:
14-
return models.ConfigContext.objects.get(pk=id)
11+
config_context: ConfigContextType = strawberry_django.field()
1512
config_context_list: List[ConfigContextType] = strawberry_django.field()
1613

17-
@strawberry.field
18-
def config_template(self, id: int) -> ConfigTemplateType:
19-
return models.ConfigTemplate.objects.get(pk=id)
14+
config_template: ConfigTemplateType = strawberry_django.field()
2015
config_template_list: List[ConfigTemplateType] = strawberry_django.field()
2116

22-
@strawberry.field
23-
def custom_field(self, id: int) -> CustomFieldType:
24-
return models.CustomField.objects.get(pk=id)
17+
custom_field: CustomFieldType = strawberry_django.field()
2518
custom_field_list: List[CustomFieldType] = strawberry_django.field()
2619

27-
@strawberry.field
28-
def custom_field_choice_set(self, id: int) -> CustomFieldChoiceSetType:
29-
return models.CustomFieldChoiceSet.objects.get(pk=id)
20+
custom_field_choice_set: CustomFieldChoiceSetType = strawberry_django.field()
3021
custom_field_choice_set_list: List[CustomFieldChoiceSetType] = strawberry_django.field()
3122

32-
@strawberry.field
33-
def custom_link(self, id: int) -> CustomLinkType:
34-
return models.CustomLink.objects.get(pk=id)
23+
custom_link: CustomLinkType = strawberry_django.field()
3524
custom_link_list: List[CustomLinkType] = strawberry_django.field()
3625

37-
@strawberry.field
38-
def export_template(self, id: int) -> ExportTemplateType:
39-
return models.ExportTemplate.objects.get(pk=id)
26+
export_template: ExportTemplateType = strawberry_django.field()
4027
export_template_list: List[ExportTemplateType] = strawberry_django.field()
4128

42-
@strawberry.field
43-
def image_attachment(self, id: int) -> ImageAttachmentType:
44-
return models.ImageAttachment.objects.get(pk=id)
29+
image_attachment: ImageAttachmentType = strawberry_django.field()
4530
image_attachment_list: List[ImageAttachmentType] = strawberry_django.field()
4631

47-
@strawberry.field
48-
def saved_filter(self, id: int) -> SavedFilterType:
49-
return models.SavedFilter.objects.get(pk=id)
32+
saved_filter: SavedFilterType = strawberry_django.field()
5033
saved_filter_list: List[SavedFilterType] = strawberry_django.field()
5134

52-
@strawberry.field
53-
def journal_entry(self, id: int) -> JournalEntryType:
54-
return models.JournalEntry.objects.get(pk=id)
35+
journal_entry: JournalEntryType = strawberry_django.field()
5536
journal_entry_list: List[JournalEntryType] = strawberry_django.field()
5637

57-
@strawberry.field
58-
def tag(self, id: int) -> TagType:
59-
return models.Tag.objects.get(pk=id)
38+
tag: TagType = strawberry_django.field()
6039
tag_list: List[TagType] = strawberry_django.field()
6140

62-
@strawberry.field
63-
def webhook(self, id: int) -> WebhookType:
64-
return models.Webhook.objects.get(pk=id)
41+
webhook: WebhookType = strawberry_django.field()
6542
webhook_list: List[WebhookType] = strawberry_django.field()
6643

67-
@strawberry.field
68-
def event_rule(self, id: int) -> EventRuleType:
69-
return models.EventRule.objects.get(pk=id)
44+
event_rule: EventRuleType = strawberry_django.field()
7045
event_rule_list: List[EventRuleType] = strawberry_django.field()

0 commit comments

Comments
 (0)