Skip to content

Commit b98fac2

Browse files
committed
chg: [cookiejar] import/export cookiejar from/to JSON
1 parent 37f12b9 commit b98fac2

4 files changed

Lines changed: 150 additions & 18 deletions

File tree

bin/lib/crawlers.py

Lines changed: 83 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,86 @@ def api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role,
11961196

11971197
#### API ####
11981198

1199+
def api_export_cookiejar_json(user_org, user_id, user_role, cookiejar_uuid):
1200+
resp = api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, 'view')
1201+
if resp:
1202+
return resp
1203+
cookiejar = Cookiejar(cookiejar_uuid)
1204+
storage = cookiejar.get_local_storage()
1205+
if not isinstance(storage, dict):
1206+
storage = {}
1207+
storage['cookies'] = cookiejar.get_cookies()
1208+
1209+
return {
1210+
'uuid': cookiejar_uuid,
1211+
'description': cookiejar.get_description(),
1212+
'level': cookiejar.get_level(),
1213+
'storage': storage,
1214+
}, 200
1215+
1216+
1217+
def _import_storage_in_cookiejar(cookiejar, storage):
1218+
cookies = storage.get('cookies', [])
1219+
origins = storage.get('origins')
1220+
1221+
if not cookies and not origins:
1222+
return {'error': 'No cookies or local storage to import'}, 400
1223+
1224+
cookiejar.delete_cookies()
1225+
cookiejar.delete_local_storage()
1226+
cookiejar.set_cookies(cookies)
1227+
cookiejar.set_local_storage(storage)
1228+
1229+
1230+
def _get_storage_from_cookiejar_json(data):
1231+
storage = data.get('storage')
1232+
if storage is None:
1233+
storage = data.get('local_storage', data)
1234+
if isinstance(storage, dict) and 'cookies' not in storage and 'cookies' in data:
1235+
storage['cookies'] = data.get('cookies', [])
1236+
if not isinstance(storage, dict):
1237+
return None
1238+
return storage
1239+
1240+
1241+
def api_import_cookiejar_json(user_org, user_id, user_role, cookiejar_uuid, data):
1242+
resp = api_check_cookiejar_access_acl(cookiejar_uuid, user_org, user_id, user_role, 'edit')
1243+
if resp:
1244+
return resp
1245+
storage = _get_storage_from_cookiejar_json(data)
1246+
if storage is None:
1247+
return {'error': 'invalid cookiejar JSON storage'}, 400
1248+
res = _import_storage_in_cookiejar(Cookiejar(cookiejar_uuid), storage)
1249+
if res:
1250+
return res
1251+
return {'cookiejar_uuid': cookiejar_uuid}, 200
1252+
1253+
1254+
def api_create_cookiejar_from_json(user_org, user_id, data):
1255+
storage = _get_storage_from_cookiejar_json(data)
1256+
if storage is None:
1257+
return {'error': 'invalid cookiejar JSON storage'}, 400
1258+
1259+
level = data.get('level', 1)
1260+
try:
1261+
level = int(level)
1262+
except (TypeError, ValueError):
1263+
level = 1
1264+
if level not in range(0, 3):
1265+
level = 1
1266+
1267+
description = data.get('description')
1268+
if not description:
1269+
description = 'imported from cookiejar JSON'
1270+
1271+
cookiejar_uuid = create_cookiejar(user_org, user_id, description, level, None)
1272+
res = _import_storage_in_cookiejar(Cookiejar(cookiejar_uuid), storage)
1273+
if res:
1274+
Cookiejar(cookiejar_uuid).delete()
1275+
return res
1276+
return {'cookiejar_uuid': cookiejar_uuid}, 200
1277+
1278+
11991279
def api_import_lacus_cookiejar(user_org, user_id, data, cookiejar_uuid=None):
12001280
url = data.get('url')
12011281
storage = data.get('storage')
@@ -1207,11 +1287,6 @@ def api_import_lacus_cookiejar(user_org, user_id, data, cookiejar_uuid=None):
12071287
cookiejar_uuid = data.get('uuid')
12081288
level = data.get('level', 1)
12091289
description = data.get('description')
1210-
cookies = storage.get('cookies', [])
1211-
origins = storage.get('origins')
1212-
1213-
if not cookies and not origins:
1214-
return {'error': 'No cookies or local storage to import'}, 400
12151290

12161291
# Create new cookiejar
12171292
if not cookiejar_uuid:
@@ -1223,19 +1298,9 @@ def api_import_lacus_cookiejar(user_org, user_id, data, cookiejar_uuid=None):
12231298
cookiejar = Cookiejar(cookiejar_uuid)
12241299
if not cookiejar.exists():
12251300
return {'error': 'unknown cookiejar uuid'}, 404
1226-
cookiejar.delete_local_storage()
1227-
for cookie in cookies:
1228-
name = cookie.get('name')
1229-
value = cookie.get('value')
1230-
domain = cookie.get('domain')
1231-
path = cookie.get('path')
1232-
expires = cookie.get('expires')
1233-
httponly = cookie.get('httpOnly')
1234-
secure = cookie.get('secure')
1235-
samesite = cookie.get('sameSite')
1236-
if name and value:
1237-
cookiejar.add_cookie(name, value, domain=domain, httponly=httponly, path=path, secure=secure, expires=expires, samesite=samesite)
1238-
cookiejar.set_local_storage(storage)
1301+
res = _import_storage_in_cookiejar(cookiejar, storage)
1302+
if res:
1303+
return res
12391304

12401305
return {'cookiejar_uuid': cookiejar_uuid}, 200
12411306

var/www/blueprints/crawler_splash.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,50 @@ def crawler_cookiejar_local_storage_delete():
10271027
return redirect(url_for('crawler_splash.crawler_cookiejar_show', uuid=cookiejar_uuid))
10281028

10291029

1030+
@crawler_splash.route('/crawler/cookiejar/json/export', methods=['GET'])
1031+
@login_required
1032+
@login_admin
1033+
def crawler_cookiejar_json_export():
1034+
user_org = current_user.get_org()
1035+
user_id = current_user.get_user_id()
1036+
user_role = current_user.get_role()
1037+
cookiejar_uuid = request.args.get('uuid')
1038+
1039+
res = crawlers.api_export_cookiejar_json(user_org, user_id, user_role, cookiejar_uuid)
1040+
if res[1] != 200:
1041+
return create_json_response(res[0], res[1])
1042+
response = Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json')
1043+
response.headers['Content-Disposition'] = f'attachment; filename=cookiejar-{cookiejar_uuid}.json'
1044+
return response
1045+
1046+
1047+
@crawler_splash.route('/crawler/cookiejar/json/import', methods=['POST'])
1048+
@login_required
1049+
@login_admin
1050+
def crawler_cookiejar_json_import():
1051+
user_org = current_user.get_org()
1052+
user_id = current_user.get_user_id()
1053+
user_role = current_user.get_role()
1054+
cookiejar_uuid = request.form.get('uuid')
1055+
1056+
if 'file' not in request.files:
1057+
return create_json_response({'error': 'cookiejar JSON file not set'}, 400)
1058+
1059+
file = request.files['file']
1060+
try:
1061+
data = json.loads(file.read().decode())
1062+
except json.decoder.JSONDecodeError:
1063+
return create_json_response({'error': 'invalid cookiejar JSON'}, 400)
1064+
1065+
if cookiejar_uuid:
1066+
res = crawlers.api_import_cookiejar_json(user_org, user_id, user_role, cookiejar_uuid, data)
1067+
else:
1068+
res = crawlers.api_create_cookiejar_from_json(user_org, user_id, data)
1069+
if res[1] != 200:
1070+
return create_json_response(res[0], res[1])
1071+
return redirect(url_for('crawler_splash.crawler_cookiejar_show', uuid=res[0]['cookiejar_uuid']))
1072+
1073+
10301074
@crawler_splash.route('/crawler/cookiejar/delete', methods=['GET'])
10311075
@login_required
10321076
@login_user_no_api

var/www/templates/crawler/crawler_splash/all_cookiejar.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ <h5 class="card-title"><i class="fas fa-cookie-bite"></i> Global Cookiejar</h5>
6767
Create Cookiejar
6868
</a>
6969

70+
{% if current_user.is_admin() %}
71+
<form class="d-inline-block my-4" action="{{ url_for('crawler_splash.crawler_cookiejar_json_import') }}" method="post" enctype="multipart/form-data">
72+
<label class="btn btn-warning mb-0">
73+
<i class="fas fa-file-import"></i>
74+
Import Cookiejar JSON
75+
<input type="file" name="file" accept="application/json,.json" onchange="this.form.submit();" hidden>
76+
</label>
77+
</form>
78+
{% endif %}
79+
7080
</div>
7181
</div>
7282
</div>

var/www/templates/crawler/crawler_splash/show_cookiejar.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ <h5 class="card-title"><i class="fas fa-cookie-bite"></i> Edit Cookiejar</h5>
4949
Edit Description <i class="fas fa-pencil-alt"></i>
5050
</button>
5151

52+
{% if current_user.is_admin() %}
53+
<a class="btn btn-secondary" href="{{ url_for('crawler_splash.crawler_cookiejar_json_export') }}?uuid={{cookiejar_metadata['uuid']}}">
54+
Export JSON <i class="fas fa-file-export"></i>
55+
</a>
56+
<form class="d-inline-block" action="{{ url_for('crawler_splash.crawler_cookiejar_json_import') }}" method="post" enctype="multipart/form-data">
57+
<input type="hidden" name="uuid" value="{{cookiejar_metadata['uuid']}}">
58+
<label class="btn btn-warning mb-0">
59+
Import JSON <i class="fas fa-file-import"></i>
60+
<input type="file" name="file" accept="application/json,.json" onchange="this.form.submit();" hidden>
61+
</label>
62+
</form>
63+
{% endif %}
64+
5265
<span class="mt-1" id="description-edit-block">
5366
<div class="input-group">
5467
<input class="form-control" type="text" id="input-description" value="{{cookiejar_metadata['description']}}">

0 commit comments

Comments
 (0)