Skip to content

Commit 9b4c347

Browse files
author
labkey-ians
authored
Merge pull request #8 from LabKey/fb_csrf
ServerContext, CSRF
2 parents bc8b311 + 8f5e16c commit 9b4c347

10 files changed

+140
-202
lines changed

labkey/experiment.py

Lines changed: 10 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,6 @@
1616
from __future__ import unicode_literals
1717
import json
1818

19-
from requests.exceptions import SSLError, ConnectionError
20-
from labkey.utils import build_url, handle_response
21-
from labkey.exceptions import ServerContextError, ServerNotFoundError
22-
23-
24-
# EXAMPLE
25-
# -------
26-
27-
# from utils import create_server_context
28-
# from experiment import load_batch, save_batch
29-
#
30-
# print("Create a server context")
31-
# server_context = create_server_context('localhost:8080', 'CDSTest Project', 'labkey', use_ssl=False)
32-
#
33-
# print("Load an Assay batch from the server")
34-
# assay_id = # provide one from your server
35-
# batch_id = # provide one from your server
36-
# run_group = load_batch(server_context, assay_id, batch_id)
37-
#
38-
# if run_group is not None:
39-
# print("Batch Id: " + str(run_group.id))
40-
# print("Created By: " + run_group.created_by)
41-
#
42-
# print("Modify a property")
43-
# batch_property_name = '' # provide one from your assay
44-
# batch_property_value = '' # provide one
45-
# run_group.properties[batch_property_name] = batch_property_value
46-
#
47-
# print("Save the batch")
48-
# save_batch(server_context, assay_id, run_group)
49-
50-
# --------
51-
# /EXAMPLE
52-
5319

5420
# TODO Incorporate logging
5521
def load_batch(server_context, assay_id, batch_id):
@@ -60,8 +26,7 @@ def load_batch(server_context, assay_id, batch_id):
6026
:param batch_id:
6127
:return:
6228
"""
63-
load_batch_url = build_url(server_context, 'assay', 'getAssayBatch.api')
64-
session = server_context['session']
29+
load_batch_url = server_context.build_url('assay', 'getAssayBatch.api')
6530
loaded_batch = None
6631

6732
payload = {
@@ -74,15 +39,9 @@ def load_batch(server_context, assay_id, batch_id):
7439
'Accept': 'text/plain'
7540
}
7641

77-
try:
78-
response = session.post(load_batch_url, data=json.dumps(payload, sort_keys=True), headers=headers)
79-
json_body = handle_response(response)
80-
if json_body is not None:
81-
loaded_batch = Batch.from_data(json_body['batch'])
82-
except SSLError as e:
83-
raise ServerContextError(e)
84-
except ConnectionError as e:
85-
raise ServerNotFoundError(e)
42+
json_body = server_context.make_request(load_batch_url, json.dumps(payload, sort_keys=True), headers=headers)
43+
if json_body is not None:
44+
loaded_batch = Batch.from_data(json_body['batch'])
8645

8746
return loaded_batch
8847

@@ -110,11 +69,9 @@ def save_batches(server_context, assay_id, batches):
11069
:param batches: The Batch(es) to save.
11170
:return:
11271
"""
113-
114-
save_batch_url = build_url(server_context, 'assay', 'saveAssayBatch.api')
115-
session = server_context['session']
116-
72+
save_batch_url = server_context.build_url('assay', 'saveAssayBatch.api')
11773
json_batches = []
74+
11875
if batches is None:
11976
return None # Nothing to save
12077

@@ -133,15 +90,10 @@ def save_batches(server_context, assay_id, batches):
13390
'Accept': 'text/plain'
13491
}
13592

136-
try:
137-
# print(payload)
138-
response = session.post(save_batch_url, data=json.dumps(payload, sort_keys=True), headers=headers)
139-
json_body = handle_response(response)
140-
if json_body is not None:
141-
resp_batches = json_body['batches']
142-
return [Batch.from_data(resp_batch) for resp_batch in resp_batches]
143-
except SSLError as e:
144-
raise ServerContextError(e)
93+
json_body = server_context.make_request(save_batch_url, json.dumps(payload, sort_keys=True), headers=headers)
94+
if json_body is not None:
95+
resp_batches = json_body['batches']
96+
return [Batch.from_data(resp_batch) for resp_batch in resp_batches]
14597

14698
return None
14799

labkey/query.py

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@
4747
from __future__ import unicode_literals
4848
import json
4949

50-
from labkey.utils import build_url, make_request
51-
52-
5350
_query_headers = {
5451
'Content-Type': 'application/json'
5552
}
@@ -79,17 +76,15 @@ def delete_rows(server_context, schema_name, query_name, rows, container_path=No
7976
:param timeout: timeout of request in seconds (defaults to 30s)
8077
:return:
8178
"""
82-
url = build_url(server_context, 'query', 'deleteRows.api', container_path=container_path)
79+
url = server_context.build_url('query', 'deleteRows.api', container_path=container_path)
8380

8481
payload = {
8582
'schemaName': schema_name,
8683
'queryName': query_name,
8784
'rows': rows
8885
}
8986

90-
# explicit json payload and headers required for form generation
91-
return make_request(server_context, url, json.dumps(payload, sort_keys=True), headers=_query_headers,
92-
timeout=timeout)
87+
return server_context.make_request(url, json.dumps(payload, sort_keys=True), headers=_query_headers, timeout=timeout)
9388

9489

9590
def execute_sql(server_context, schema_name, sql, container_path=None,
@@ -119,7 +114,7 @@ def execute_sql(server_context, schema_name, sql, container_path=None,
119114
:param timeout: timeout of request in seconds (defaults to 30s)
120115
:return:
121116
"""
122-
url = build_url(server_context, 'query', 'executeSql.api', container_path=container_path)
117+
url = server_context.build_url('query', 'executeSql.api', container_path=container_path)
123118

124119
payload = {
125120
'schemaName': schema_name,
@@ -148,7 +143,7 @@ def execute_sql(server_context, schema_name, sql, container_path=None,
148143
if required_version is not None:
149144
payload['apiVersion'] = required_version
150145

151-
return make_request(server_context, url, payload, timeout=timeout)
146+
return server_context.make_request(url, payload, timeout=timeout)
152147

153148

154149
def insert_rows(server_context, schema_name, query_name, rows, container_path=None, timeout=_default_timeout):
@@ -162,17 +157,16 @@ def insert_rows(server_context, schema_name, query_name, rows, container_path=No
162157
:param timeout: timeout of request in seconds (defaults to 30s)
163158
:return:
164159
"""
165-
url = build_url(server_context, 'query', 'insertRows.api', container_path=container_path)
160+
url = server_context.build_url('query', 'insertRows.api', container_path=container_path)
166161

167162
payload = {
168163
'schemaName': schema_name,
169164
'queryName': query_name,
170165
'rows': rows
171166
}
172167

173-
# explicit json payload and headers required for form generation
174-
return make_request(server_context, url, json.dumps(payload, sort_keys=True), headers=_query_headers,
175-
timeout=timeout)
168+
return server_context.make_request(url, json.dumps(payload, sort_keys=True), headers=_query_headers,
169+
timeout=timeout)
176170

177171

178172
def select_rows(server_context, schema_name, query_name, view_name=None,
@@ -216,7 +210,7 @@ def select_rows(server_context, schema_name, query_name, view_name=None,
216210
:param timeout: Request timeout in seconds (defaults to 30s)
217211
:return:
218212
"""
219-
url = build_url(server_context, 'query', 'getQuery.api', container_path=container_path)
213+
url = server_context.build_url('query', 'getQuery.api', container_path=container_path)
220214

221215
payload = {
222216
'schemaName': schema_name,
@@ -268,7 +262,7 @@ def select_rows(server_context, schema_name, query_name, view_name=None,
268262
if required_version is not None:
269263
payload['apiVersion'] = required_version
270264

271-
return make_request(server_context, url, payload, timeout=timeout)
265+
return server_context.make_request(url, payload, timeout=timeout)
272266

273267

274268
def update_rows(server_context, schema_name, query_name, rows, container_path=None, timeout=_default_timeout):
@@ -283,17 +277,16 @@ def update_rows(server_context, schema_name, query_name, rows, container_path=No
283277
:param timeout: timeout of request in seconds (defaults to 30s)
284278
:return:
285279
"""
286-
url = build_url(server_context, 'query', 'updateRows.api', container_path=container_path)
280+
url = server_context.build_url('query', 'updateRows.api', container_path=container_path)
287281

288282
payload = {
289283
'schemaName': schema_name,
290284
'queryName': query_name,
291285
'rows': rows
292286
}
293287

294-
# explicit json payload and headers required for form generation
295-
return make_request(server_context, url, json.dumps(payload, sort_keys=True), headers=_query_headers,
296-
timeout=timeout)
288+
return server_context.make_request(url, json.dumps(payload, sort_keys=True), headers=_query_headers,
289+
timeout=timeout)
297290

298291

299292
# TODO: Provide filter generators.

labkey/security.py

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#
1616
from __future__ import unicode_literals
1717

18-
from labkey.utils import build_url, make_request
19-
2018
security_controller = 'security'
2119
user_controller = 'user'
2220

@@ -68,13 +66,13 @@ def create_user(server_context, email, container_path=None, send_email=False):
6866
:param send_email: true to send email notification to user
6967
:return:
7068
"""
71-
url = build_url(server_context, security_controller, 'createNewUser.api', container_path)
69+
url = server_context.build_url(security_controller, 'createNewUser.api', container_path)
7270
payload = {
7371
'email': email,
7472
'sendEmail': send_email
7573
}
7674

77-
return make_request(server_context, url, payload)
75+
return server_context.make_request(url, payload)
7876

7977

8078
def deactivate_users(server_context, target_ids, container_path=None):
@@ -118,8 +116,8 @@ def get_roles(server_context, container_path=None):
118116
:param container_path:
119117
:return:
120118
"""
121-
url = build_url(server_context, security_controller, 'getRoles.api', container_path=container_path)
122-
return make_request(server_context, url, None)
119+
url = server_context.build_url(security_controller, 'getRoles.api', container_path=container_path)
120+
return server_context.make_request(url, None)
123121

124122

125123
def get_user_by_email(server_context, email):
@@ -129,9 +127,9 @@ def get_user_by_email(server_context, email):
129127
:param email:
130128
:return:
131129
"""
132-
url = build_url(server_context, user_controller, 'getUsers.api')
130+
url = server_context.build_url(user_controller, 'getUsers.api')
133131
payload = dict(includeDeactivatedAccounts=True)
134-
result = make_request(server_context, url, payload)
132+
result = server_context.make_request(url, payload)
135133

136134
if result is None or result['users'] is None:
137135
raise ValueError("No Users in container" + email)
@@ -144,13 +142,11 @@ def get_user_by_email(server_context, email):
144142

145143

146144
def list_groups(server_context, include_site_groups=False, container_path=None):
147-
url = build_url(server_context, security_controller, 'listProjectGroups.api', container_path)
145+
url = server_context.build_url(security_controller, 'listProjectGroups.api', container_path)
148146

149-
payload = {
147+
return server_context.make_request(url, {
150148
'includeSiteGroups': include_site_groups
151-
}
152-
153-
return make_request(server_context, url, payload)
149+
})
154150

155151

156152
def remove_from_group(server_context, user_ids, group_id, container_path=None):
@@ -188,13 +184,11 @@ def reset_password(server_context, email, container_path=None):
188184
:param container_path:
189185
:return:
190186
"""
191-
url = build_url(server_context, security_controller, 'adminRotatePassword.api', container_path)
187+
url = server_context.build_url(security_controller, 'adminRotatePassword.api', container_path)
192188

193-
payload = {
189+
return server_context.make_request(url, {
194190
'email': email
195-
}
196-
197-
return make_request(server_context, url, payload)
191+
})
198192

199193

200194
def __make_security_group_api_request(server_context, api, user_ids, group_id, container_path):
@@ -207,18 +201,16 @@ def __make_security_group_api_request(server_context, api, user_ids, group_id, c
207201
:param container_path: Additional container context path
208202
:return: Request json object
209203
"""
210-
url = build_url(server_context, security_controller, api, container_path)
204+
url = server_context.build_url(security_controller, api, container_path)
211205

212206
# if user_ids is only a single scalar make it an array
213207
if not hasattr(user_ids, "__iter__"):
214208
user_ids = [user_ids]
215209

216-
payload = {
210+
return server_context.make_request(url, {
217211
'groupId': group_id,
218212
'principalIds': user_ids
219-
}
220-
221-
return make_request(server_context, url, payload)
213+
})
222214

223215

224216
def __make_security_role_api_request(server_context, api, role, email=None, user_id=None, container_path=None):
@@ -234,15 +226,13 @@ def __make_security_role_api_request(server_context, api, role, email=None, user
234226
if email is None and user_id is None:
235227
raise ValueError("Must supply either/both [email] or [user_id]")
236228

237-
url = build_url(server_context, security_controller, api, container_path)
229+
url = server_context.build_url(security_controller, api, container_path)
238230

239-
payload = {
231+
return server_context.make_request(url, {
240232
'roleClassName': role['uniqueName'],
241233
'principalId': user_id,
242234
'email': email
243-
}
244-
245-
return make_request(server_context, url, payload)
235+
})
246236

247237

248238
def __make_user_api_request(server_context, target_ids, api, container_path=None):
@@ -254,9 +244,8 @@ def __make_user_api_request(server_context, target_ids, api, container_path=None
254244
:param container_path: container context
255245
:return: response json
256246
"""
257-
url = build_url(server_context, user_controller, api, container_path)
258-
payload = {
259-
'userId': target_ids
260-
}
247+
url = server_context.build_url(user_controller, api, container_path)
261248

262-
return make_request(server_context, url, payload)
249+
return server_context.make_request(url, {
250+
'userId': target_ids
251+
})

labkey/unsupported/messageboard.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"""
2424
from __future__ import unicode_literals
2525
from requests.exceptions import SSLError
26-
from labkey.utils import build_url
2726

2827

2928
def post_message(server_context, message_title, message_body, render_as, container_path=None):
@@ -36,19 +35,16 @@ def post_message(server_context, message_title, message_body, render_as, contain
3635
:param container_path: Optional container path that can be used to override the server_context container path
3736
:return: Returns 1 if successful, 0 is post failed.
3837
"""
39-
# Build the URL for querying LabKey Server
40-
message_url = build_url(server_context, 'announcements', 'insert.api', container_path=container_path)
38+
message_url = server_context.build_url('announcements', 'insert.api', container_path=container_path)
4139

4240
message_data = {
4341
'title': message_title,
4442
'body': message_body,
4543
'rendererType': render_as
4644
}
4745

48-
session = server_context['session']
49-
5046
try:
51-
message_response = session.post(message_url, message_data)
47+
server_context.make_request(message_url, message_data)
5248
except SSLError as e:
5349
print("There was problem while attempting to submit the message to " + str(e.geturl()) + ". The HTTP response code was " + str(e.getcode()))
5450
print("The HTTP client error was: " + format(e))

0 commit comments

Comments
 (0)