flet-web 0.70.0.dev6519__tar.gz → 0.70.0.dev6533__tar.gz

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.

Potentially problematic release.


This version of flet-web might be problematic. Click here for more details.

Files changed (24) hide show
  1. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/PKG-INFO +1 -1
  2. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/pyproject.toml +1 -1
  3. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_app.py +1 -1
  4. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_app_manager.py +2 -3
  5. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_static_files.py +3 -3
  6. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_upload.py +36 -13
  7. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/uploads.py +4 -3
  8. flet_web-0.70.0.dev6533/src/flet_web/version.py +1 -0
  9. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web.egg-info/PKG-INFO +1 -1
  10. flet_web-0.70.0.dev6519/src/flet_web/version.py +0 -1
  11. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/README.md +0 -0
  12. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/setup.cfg +0 -0
  13. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/__init__.py +0 -0
  14. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/__init__.py +0 -0
  15. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/app.py +0 -0
  16. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_fastapi.py +0 -0
  17. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/flet_oauth.py +0 -0
  18. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/oauth_state.py +0 -0
  19. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/fastapi/serve_fastapi_web_app.py +0 -0
  20. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web/patch_index.py +0 -0
  21. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web.egg-info/SOURCES.txt +0 -0
  22. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web.egg-info/dependency_links.txt +0 -0
  23. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web.egg-info/requires.txt +0 -0
  24. {flet_web-0.70.0.dev6519 → flet_web-0.70.0.dev6533}/src/flet_web.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-web
3
- Version: 0.70.0.dev6519
3
+ Version: 0.70.0.dev6533
4
4
  Summary: Flet web client in Flutter.
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flet-web"
3
- version = "0.70.0.dev6519"
3
+ version = "0.70.0.dev6533"
4
4
  description = "Flet web client in Flutter."
5
5
  authors = [{ name = "Appveyor Systems Inc.", email = "hello@flet.dev" }]
6
6
  license = "Apache-2.0"
@@ -325,7 +325,7 @@ class FletApp(Connection):
325
325
 
326
326
  else:
327
327
  # it's something else
328
- raise Exception(f'Unknown message "{action}": {body}')
328
+ raise RuntimeError(f'Unknown message "{action}": {body}')
329
329
 
330
330
  if task:
331
331
  self.__running_tasks.add(task)
@@ -6,11 +6,10 @@ from concurrent.futures import ThreadPoolExecutor
6
6
  from datetime import datetime, timezone
7
7
  from typing import Optional
8
8
 
9
+ import flet_web.fastapi as flet_fastapi
9
10
  from flet.messaging.connection import Connection
10
11
  from flet.messaging.session import Session
11
12
  from flet.pubsub.pubsub_hub import PubSubHub
12
-
13
- import flet_web.fastapi as flet_fastapi
14
13
  from flet_web.fastapi.oauth_state import OAuthState
15
14
 
16
15
  logger = logging.getLogger(flet_fastapi.__name__)
@@ -84,7 +83,7 @@ class FletAppManager:
84
83
  session = self.__sessions[session_id]
85
84
  await session.connect(conn)
86
85
  else:
87
- raise Exception(f"Session has expired or not found: {session_id}")
86
+ raise RuntimeError(f"Session has expired or not found: {session_id}")
88
87
 
89
88
  async def disconnect_session(self, session_id: str, session_timeout_seconds: int):
90
89
  logger.info(f"Session disconnected: {session_id}")
@@ -6,11 +6,11 @@ from pathlib import Path
6
6
  from typing import Optional
7
7
 
8
8
  from fastapi.staticfiles import StaticFiles
9
- from flet.controls.types import RouteUrlStrategy, WebRenderer
10
- from flet.utils import Once, get_bool_env_var
11
9
  from starlette.types import Receive, Scope, Send
12
10
 
13
11
  import flet_web.fastapi as flet_fastapi
12
+ from flet.controls.types import RouteUrlStrategy, WebRenderer
13
+ from flet.utils import Once, get_bool_env_var
14
14
  from flet_web import (
15
15
  get_package_web_dir,
16
16
  patch_font_manifest_json,
@@ -120,7 +120,7 @@ class FletStaticFiles(StaticFiles):
120
120
  logger.info(f"Web root: {web_dir}")
121
121
 
122
122
  if not os.path.exists(web_dir):
123
- raise Exception(f"Web root path not found: {web_dir}")
123
+ raise RuntimeError(f"Web root path not found: {web_dir}")
124
124
 
125
125
  # user-defined assets
126
126
  if self.__assets_dir:
@@ -3,9 +3,10 @@ import os
3
3
  from datetime import datetime, timezone
4
4
  from typing import Optional
5
5
 
6
- import flet_web.fastapi as flet_fastapi
7
6
  from anyio import open_file
8
- from fastapi import Request
7
+ from fastapi import HTTPException, Request, status
8
+
9
+ import flet_web.fastapi as flet_fastapi
9
10
  from flet_web.uploads import build_upload_query_string, get_upload_signature
10
11
 
11
12
  logger = logging.getLogger(flet_fastapi.__name__)
@@ -18,7 +19,8 @@ class FletUpload:
18
19
  Parameters:
19
20
 
20
21
  * `upload_dir` (str) - an absolute path to a directory with uploaded files.
21
- * `max_upload_size` (str, int) - maximum size of a single upload, bytes. Unlimited if `None`.
22
+ * `max_upload_size` (str, int) - maximum size of a single upload, bytes.
23
+ Unlimited if `None`.
22
24
  * `secret_key` (str, optional) - secret key to sign and verify upload requests.
23
25
  """
24
26
 
@@ -50,14 +52,24 @@ class FletUpload:
50
52
  """
51
53
 
52
54
  async def handle(self, request: Request):
53
- file_name = request.query_params["f"]
54
- expire_str = request.query_params["e"]
55
- signature = request.query_params["s"]
55
+ query_params = request.query_params
56
+ file_name = query_params.get("f")
57
+ expire_str = query_params.get("e")
58
+ signature = query_params.get("s")
56
59
 
57
60
  if not file_name or not expire_str or not signature:
58
- raise Exception("Invalid request")
61
+ raise HTTPException(
62
+ status_code=status.HTTP_400_BAD_REQUEST,
63
+ detail="Missing upload parameters",
64
+ )
59
65
 
60
- expire_date = datetime.fromisoformat(expire_str)
66
+ try:
67
+ expire_date = datetime.fromisoformat(expire_str)
68
+ except ValueError as e:
69
+ raise HTTPException(
70
+ status_code=status.HTTP_400_BAD_REQUEST,
71
+ detail="Invalid expiration parameter",
72
+ ) from e
61
73
 
62
74
  # verify signature
63
75
  query_string = build_upload_query_string(file_name, expire_date)
@@ -67,17 +79,26 @@ class FletUpload:
67
79
  )
68
80
  != signature
69
81
  ):
70
- raise Exception("Invalid request")
82
+ raise HTTPException(
83
+ status_code=status.HTTP_403_FORBIDDEN,
84
+ detail="Invalid upload signature",
85
+ )
71
86
 
72
87
  # check expiration date
73
88
  if datetime.now(timezone.utc) >= expire_date:
74
- raise Exception("Invalid request")
89
+ raise HTTPException(
90
+ status_code=status.HTTP_410_GONE,
91
+ detail="Upload URL has expired",
92
+ )
75
93
 
76
94
  # build/validate dest path
77
95
  joined_path = os.path.join(self.__upload_dir, file_name)
78
96
  full_path = os.path.realpath(joined_path)
79
97
  if os.path.commonpath([full_path, self.__upload_dir]) != self.__upload_dir:
80
- raise Exception("Invalid request")
98
+ raise HTTPException(
99
+ status_code=status.HTTP_400_BAD_REQUEST,
100
+ detail="Invalid upload destination",
101
+ )
81
102
 
82
103
  # create directory if not exists
83
104
  dest_dir = os.path.dirname(full_path)
@@ -89,7 +110,9 @@ class FletUpload:
89
110
  async for chunk in request.stream():
90
111
  size += len(chunk)
91
112
  if self.__max_upload_size and size > self.__max_upload_size:
92
- raise Exception(
93
- f"Max upload size reached: {self.__max_upload_size}"
113
+ raise HTTPException(
114
+ status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
115
+ detail="Max upload size exceeded: "
116
+ f"{self.__max_upload_size} bytes",
94
117
  )
95
118
  await f.write(chunk)
@@ -39,8 +39,9 @@ def get_upload_signature(
39
39
  if env_secret_key:
40
40
  secret_key = env_secret_key
41
41
  if not secret_key:
42
- raise Exception(
43
- "Specify secret_key parameter or set FLET_SECRET_KEY environment variable to enable uploads."
42
+ raise RuntimeError(
43
+ "Specify secret_key parameter or set FLET_SECRET_KEY environment "
44
+ "variable to enable uploads."
44
45
  )
45
46
  signing_key = hmac.new(
46
47
  secret_key.encode("utf-8"),
@@ -49,6 +50,6 @@ def get_upload_signature(
49
50
  ).digest()
50
51
  return hmac.new(
51
52
  signing_key,
52
- f"{upload_endpoint_path.strip('/')}{query_string}".encode("utf-8"),
53
+ f"{upload_endpoint_path.strip('/')}{query_string}".encode(),
53
54
  hashlib.sha256,
54
55
  ).hexdigest()
@@ -0,0 +1 @@
1
+ version = "0.70.0.dev6533"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-web
3
- Version: 0.70.0.dev6519
3
+ Version: 0.70.0.dev6533
4
4
  Summary: Flet web client in Flutter.
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -1 +0,0 @@
1
- version = "0.70.0.dev6519"