opencloning 0.3.7__py3-none-any.whl → 0.3.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,6 +31,25 @@ if PLANNOTATE_URL is not None and not PLANNOTATE_URL.endswith('/'):
31
31
  PROXY_URL = os.environ.get('PROXY_URL')
32
32
  PROXY_CERT_FILE = os.environ.get('PROXY_CERT_FILE')
33
33
 
34
+ # Allowed external URLs ===========================================
35
+ default_allowed_urls = [
36
+ 'https://www.addgene.org/',
37
+ 'https://media.addgene.org/',
38
+ 'https://seva-plasmids.com/',
39
+ 'https://api.ncbi.nlm.nih.gov/datasets/v2alpha/',
40
+ 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/',
41
+ 'https://www.snapgene.com/local/fetch.php',
42
+ 'https://benchling.com/',
43
+ 'https://assets.opencloning.org/annotated-igem-distribution',
44
+ 'http://www.euroscarf.de/',
45
+ 'https://wekwikgene.wllsb.edu.cn',
46
+ ]
47
+
48
+ if os.environ.get('ALLOWED_EXTERNAL_URLS') is not None:
49
+ ALLOWED_EXTERNAL_URLS = os.environ['ALLOWED_EXTERNAL_URLS'].split(',')
50
+ else:
51
+ ALLOWED_EXTERNAL_URLS = default_allowed_urls
52
+
34
53
 
35
54
  class Settings(BaseModel):
36
55
  SERVE_FRONTEND: bool
@@ -43,6 +62,8 @@ class Settings(BaseModel):
43
62
  PROXY_URL: str | None
44
63
  # Must be a full path to the proxy certificate file
45
64
  PROXY_CERT_FILE: str | None
65
+ # Allowed external URLs
66
+ ALLOWED_EXTERNAL_URLS: list[str]
46
67
 
47
68
 
48
69
  settings = Settings(
@@ -55,4 +76,5 @@ settings = Settings(
55
76
  PLANNOTATE_TIMEOUT=PLANNOTATE_TIMEOUT,
56
77
  PROXY_URL=PROXY_URL,
57
78
  PROXY_CERT_FILE=PROXY_CERT_FILE,
79
+ ALLOWED_EXTERNAL_URLS=ALLOWED_EXTERNAL_URLS,
58
80
  )
@@ -216,6 +216,11 @@ def repository_id_http_error_handler(exception: HTTPError, source: RepositoryIdS
216
216
  404,
217
217
  f'{source.repository_name} returned: {exception} - Likely you inserted a wrong {source.repository_name} id',
218
218
  )
219
+ elif exception.code == 403:
220
+ raise HTTPException(
221
+ 403,
222
+ f'Request to {source.repository_name} is not allowed. Please check that the URL is whitelisted.',
223
+ )
219
224
 
220
225
 
221
226
  # Redirect to the right repository
@@ -6,36 +6,24 @@ from httpx import ( # noqa: F401
6
6
  TimeoutException,
7
7
  AsyncHTTPTransport,
8
8
  Request,
9
- RequestError,
10
9
  )
10
+ from urllib.error import HTTPError
11
11
  import ssl
12
12
  import certifi
13
13
  from .app_settings import settings
14
- import re
15
-
16
- white_listed_urls = {
17
- r'^https://www.addgene.org/',
18
- r'^https://media.addgene.org/',
19
- r'^https://wekwikgene.wllsb.edu.cn',
20
- r'^https://seva-plasmids.com/',
21
- r'^https://api.ncbi.nlm.nih.gov/datasets/v2alpha/',
22
- r'^https://eutils.ncbi.nlm.nih.gov/entrez/eutils/',
23
- r'^https://www.snapgene.com/local/fetch.php',
24
- r'^https://benchling.com/',
25
- r'^https://assets.opencloning.org/annotated-igem-distribution',
26
- r'^http://www.euroscarf.de/',
27
- }
14
+
15
+ allowed_external_urls = settings.ALLOWED_EXTERNAL_URLS
28
16
 
29
17
  if settings.PLANNOTATE_URL:
30
- white_listed_urls.add(settings.PLANNOTATE_URL)
18
+ allowed_external_urls.append(settings.PLANNOTATE_URL)
31
19
 
32
20
 
33
- class WhiteListTransport(AsyncHTTPTransport):
21
+ class AllowedExternalUrlsTransport(AsyncHTTPTransport):
34
22
  async def handle_async_request(self, request: Request) -> Response:
35
- if any(re.match(url, str(request.url)) for url in white_listed_urls):
23
+ if any(str(request.url).startswith(url) for url in allowed_external_urls):
36
24
  return await super().handle_async_request(request)
37
25
 
38
- raise RequestError(f'Request to {request.url} is not whitelisted')
26
+ raise HTTPError(request.url, 403, f'Request to {request.url} is not allowed', None, None)
39
27
 
40
28
 
41
29
  proxy = None
@@ -44,7 +32,7 @@ if settings.PROXY_URL:
44
32
 
45
33
 
46
34
  def get_http_client():
47
- transport = WhiteListTransport()
35
+ transport = AllowedExternalUrlsTransport()
48
36
  client_ctx = None
49
37
  if proxy is not None:
50
38
  client_ctx = ssl.create_default_context(cafile=certifi.where())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: opencloning
3
- Version: 0.3.7
3
+ Version: 0.3.8
4
4
  Summary: Backend of OpenCloning, a web application to generate molecular cloning strategies in json format, and share them with others.
5
5
  License: MIT
6
6
  Author: Manuel Lera-Ramirez
@@ -19,7 +19,7 @@ Requires-Dist: opencloning-linkml (==0.3.0a0)
19
19
  Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
20
20
  Requires-Dist: packaging (>=25.0,<26.0)
21
21
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
22
- Requires-Dist: primer3-py (==2.0.3)
22
+ Requires-Dist: primer3-py (==2.2.0)
23
23
  Requires-Dist: pydantic (>=2.7.1,<3.0.0)
24
24
  Requires-Dist: pydna (==5.5.0)
25
25
  Requires-Dist: python-multipart
@@ -86,8 +86,8 @@ poetry install
86
86
  # Install the pre-commit hooks
87
87
  pre-commit install
88
88
 
89
- # Activate the virtual environment
90
- poetry shell
89
+ # Activate the virtual environment (used to be `poetry shell`)
90
+ poetry env activate
91
91
 
92
92
  ```
93
93
 
@@ -1,7 +1,7 @@
1
1
  opencloning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  opencloning/_version.py,sha256=6QbWXLSZypjtWL_CwJFHH4dzMRK3AUH4B0YudzvGz9s,200
3
3
  opencloning/api_config_utils.py,sha256=inAXPGYNDz-DuEoSqitImj0Vv5TpQSbMZH9D3dQb5P0,4319
4
- opencloning/app_settings.py,sha256=MScy0le1Dn00rxqDkpeoBLWwjWQTyzHBQ-MqSDdmoe4,2054
4
+ opencloning/app_settings.py,sha256=1GFD0_DcKTlhwAcbXRXGWY6d_7LrKbtbHd5NPVasKb8,2874
5
5
  opencloning/assembly2.py,sha256=M-Als7mrEdHc8Ee3Zr_pgQ5WiN7Uqd37BMxr9Q-1myw,61743
6
6
  opencloning/batch_cloning/EBIC/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  opencloning/batch_cloning/EBIC/barcode.gb,sha256=G6kP6MuY23S-n3xg16LQaTasFtYFqik5eEgcooZ9ATM,815
@@ -31,21 +31,21 @@ opencloning/ebic/primer_design.py,sha256=gPZTF9w5SV7WGgnefp_HBM831y0z73M1Kb0QUPn
31
31
  opencloning/ebic/primer_design_settings.py,sha256=OnFsuh0QCvplUEPXLZouzRo9R7rm4nLbcd2LkDCiIDM,1896
32
32
  opencloning/endpoints/annotation.py,sha256=3rlIXeNQzoqPD9lJUEBGLGxvlhUCTcfkqno814A8P0U,2283
33
33
  opencloning/endpoints/assembly.py,sha256=XBv2Vg0MrBl4WjKlclyJ4QTgydqda9P3LRl_25y3TOo,21307
34
- opencloning/endpoints/external_import.py,sha256=i2hAKSYi2IIdglmDhDhWmBzHbhn6A9A8ybbj4nmhROM,18188
34
+ opencloning/endpoints/external_import.py,sha256=Z9zd94kzmnbLG_yEAjI-1HK7sIAMcLz3FSZZR66BV-U,18386
35
35
  opencloning/endpoints/no_assembly.py,sha256=NY6rhEDCNoZVn6Xk81cen2n-FkMr7ierfxM8G0npbQs,4722
36
36
  opencloning/endpoints/no_input.py,sha256=DuqKD3Ph3a44ZxPMEzZv1nwD5xlxYsN7YyxXcfjSUFc,3844
37
37
  opencloning/endpoints/other.py,sha256=7YBXU5UrVCjEjOjdYWw-0sASXn3MhWVZYwDYSZD4C9E,3452
38
38
  opencloning/endpoints/primer_design.py,sha256=3eiQ7MwgeLoAuXFUMNF-DzjzwH_eJGCjd4s32CjxIic,12717
39
39
  opencloning/gateway.py,sha256=pFB3gsCQL715kOFOP1NQOOsQqrkWuQe5qXk4IunF5SA,8486
40
40
  opencloning/get_router.py,sha256=l2DXaTbeL2tDqlnVMlcewutzt1sjaHlxku1X9HVUwJk,252
41
- opencloning/http_client.py,sha256=Ndxuoknrit5glKehvWLfKjqp0miLAfVsfLh4q57gEM4,1612
41
+ opencloning/http_client.py,sha256=coVesi_qJWea-VHBOd-V-Th6e4P9rzl-8ZILPGq2ne0,1262
42
42
  opencloning/main.py,sha256=l9PrPBMtGMEWxAPiPWR15Qv2oDNnRoNd8H8E3bZW6Do,3750
43
43
  opencloning/ncbi_requests.py,sha256=b8ow9TDpXbyYk_0HeK-7RXWwwZGrhH-MylSNc3_tH0I,5557
44
44
  opencloning/primer_design.py,sha256=nqCmYIZ7UvU4CQwVGJwX7T5LTHwt3-51_ZcTZZAgT_Y,9175
45
45
  opencloning/pydantic_models.py,sha256=lMO78M4MwDgzTEGz9qzsaADwAFXagWK4qGsF1K1hLZw,18865
46
46
  opencloning/request_examples.py,sha256=QAsJxVaq5tHwlPB404IiJ9WC6SA7iNY7XnJm63BWT_E,2944
47
47
  opencloning/utils.py,sha256=0Lvw1h1AsUJTK2b9mNzYVi_DBeWmWCFA5dIPl_gERcI,1479
48
- opencloning-0.3.7.dist-info/LICENSE,sha256=VSdVE1f8axjIh6gvo9ZZygJdTVkRFMcwCW_hvjOHC_w,1058
49
- opencloning-0.3.7.dist-info/METADATA,sha256=yuwNExxPXtTWO-Xiur4esQhroyB85O6oo_BtQUQvnzw,9041
50
- opencloning-0.3.7.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
51
- opencloning-0.3.7.dist-info/RECORD,,
48
+ opencloning-0.3.8.dist-info/LICENSE,sha256=VSdVE1f8axjIh6gvo9ZZygJdTVkRFMcwCW_hvjOHC_w,1058
49
+ opencloning-0.3.8.dist-info/METADATA,sha256=PUYYRDa7KjQKMswUYWykI9uj15NM-yt7qZ_ik-Hvt4w,9076
50
+ opencloning-0.3.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
51
+ opencloning-0.3.8.dist-info/RECORD,,