flwr-nightly 1.9.0.dev20240501__py3-none-any.whl → 1.9.0.dev20240503__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.
Potentially problematic release.
This version of flwr-nightly might be problematic. Click here for more details.
- flwr/common/logger.py +11 -4
- flwr/server/app.py +13 -7
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +19 -20
- flwr/server/superlink/state/in_memory_state.py +4 -4
- flwr/server/superlink/state/sqlite_state.py +9 -9
- flwr/server/superlink/state/state.py +3 -3
- flwr/simulation/run_simulation.py +4 -4
- {flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/METADATA +1 -1
- {flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/RECORD +12 -12
- {flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/entry_points.txt +0 -0
flwr/common/logger.py
CHANGED
|
@@ -82,13 +82,20 @@ class ConsoleHandler(StreamHandler):
|
|
|
82
82
|
return formatter.format(record)
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
def update_console_handler(
|
|
85
|
+
def update_console_handler(
|
|
86
|
+
level: Optional[int] = None,
|
|
87
|
+
timestamps: Optional[bool] = None,
|
|
88
|
+
colored: Optional[bool] = None,
|
|
89
|
+
) -> None:
|
|
86
90
|
"""Update the logging handler."""
|
|
87
91
|
for handler in logging.getLogger(LOGGER_NAME).handlers:
|
|
88
92
|
if isinstance(handler, ConsoleHandler):
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
if level is not None:
|
|
94
|
+
handler.setLevel(level)
|
|
95
|
+
if timestamps is not None:
|
|
96
|
+
handler.timestamps = timestamps
|
|
97
|
+
if colored is not None:
|
|
98
|
+
handler.colored = colored
|
|
92
99
|
|
|
93
100
|
|
|
94
101
|
# Configure console logger
|
flwr/server/app.py
CHANGED
|
@@ -43,6 +43,7 @@ from flwr.common.constant import (
|
|
|
43
43
|
from flwr.common.exit_handlers import register_exit_handlers
|
|
44
44
|
from flwr.common.logger import log
|
|
45
45
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
46
|
+
private_key_to_bytes,
|
|
46
47
|
public_key_to_bytes,
|
|
47
48
|
ssh_types_to_elliptic_curve,
|
|
48
49
|
)
|
|
@@ -374,13 +375,18 @@ def run_superlink() -> None:
|
|
|
374
375
|
server_private_key,
|
|
375
376
|
server_public_key,
|
|
376
377
|
) = maybe_keys
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
378
|
+
state = state_factory.state()
|
|
379
|
+
state.store_client_public_keys(client_public_keys)
|
|
380
|
+
state.store_server_private_public_key(
|
|
381
|
+
private_key_to_bytes(server_private_key),
|
|
382
|
+
public_key_to_bytes(server_public_key),
|
|
383
|
+
)
|
|
384
|
+
log(
|
|
385
|
+
INFO,
|
|
386
|
+
"Client authentication enabled with %d known public keys",
|
|
387
|
+
len(client_public_keys),
|
|
388
|
+
)
|
|
389
|
+
interceptors = [AuthenticateServerInterceptor(state)]
|
|
384
390
|
|
|
385
391
|
fleet_server = _run_fleet_api_grpc_rere(
|
|
386
392
|
address=address,
|
|
@@ -16,17 +16,16 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import base64
|
|
19
|
-
from logging import
|
|
20
|
-
from typing import Any, Callable, Sequence,
|
|
19
|
+
from logging import WARNING
|
|
20
|
+
from typing import Any, Callable, Sequence, Tuple, Union
|
|
21
21
|
|
|
22
22
|
import grpc
|
|
23
|
-
from cryptography.hazmat.primitives.asymmetric import ec
|
|
24
23
|
|
|
25
24
|
from flwr.common.logger import log
|
|
26
25
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
|
26
|
+
bytes_to_private_key,
|
|
27
27
|
bytes_to_public_key,
|
|
28
28
|
generate_shared_key,
|
|
29
|
-
public_key_to_bytes,
|
|
30
29
|
verify_hmac,
|
|
31
30
|
)
|
|
32
31
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
@@ -43,6 +42,7 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
|
43
42
|
PushTaskResRequest,
|
|
44
43
|
PushTaskResResponse,
|
|
45
44
|
)
|
|
45
|
+
from flwr.server.superlink.state import State
|
|
46
46
|
|
|
47
47
|
_PUBLIC_KEY_HEADER = "public-key"
|
|
48
48
|
_AUTH_TOKEN_HEADER = "auth-token"
|
|
@@ -79,22 +79,21 @@ def _get_value_from_tuples(
|
|
|
79
79
|
class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
80
80
|
"""Server interceptor for client authentication."""
|
|
81
81
|
|
|
82
|
-
def __init__(
|
|
83
|
-
self
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
)
|
|
82
|
+
def __init__(self, state: State):
|
|
83
|
+
self.state = state
|
|
84
|
+
|
|
85
|
+
self.client_public_keys = state.get_client_public_keys()
|
|
86
|
+
if len(self.client_public_keys) == 0:
|
|
87
|
+
log(WARNING, "Authentication enabled, but no known public keys configured")
|
|
88
|
+
|
|
89
|
+
private_key = self.state.get_server_private_key()
|
|
90
|
+
public_key = self.state.get_server_public_key()
|
|
91
|
+
|
|
92
|
+
if private_key is None or public_key is None:
|
|
93
|
+
raise ValueError("Error loading authentication keys")
|
|
94
|
+
|
|
95
|
+
self.server_private_key = bytes_to_private_key(private_key)
|
|
96
|
+
self.encoded_server_public_key = base64.urlsafe_b64encode(public_key)
|
|
98
97
|
|
|
99
98
|
def intercept_service(
|
|
100
99
|
self,
|
|
@@ -254,16 +254,16 @@ class InMemoryState(State): # pylint: disable=R0902
|
|
|
254
254
|
log(ERROR, "Unexpected run creation failure.")
|
|
255
255
|
return 0
|
|
256
256
|
|
|
257
|
-
def
|
|
258
|
-
self,
|
|
257
|
+
def store_server_private_public_key(
|
|
258
|
+
self, private_key: bytes, public_key: bytes
|
|
259
259
|
) -> None:
|
|
260
|
-
"""Store `
|
|
260
|
+
"""Store `server_private_key` and `server_public_key` in state."""
|
|
261
261
|
with self.lock:
|
|
262
262
|
if self.server_private_key is None and self.server_public_key is None:
|
|
263
263
|
self.server_private_key = private_key
|
|
264
264
|
self.server_public_key = public_key
|
|
265
265
|
else:
|
|
266
|
-
raise RuntimeError("Server
|
|
266
|
+
raise RuntimeError("Server private and public key already set")
|
|
267
267
|
|
|
268
268
|
def get_server_private_key(self) -> Optional[bytes]:
|
|
269
269
|
"""Retrieve `server_private_key` in urlsafe bytes."""
|
|
@@ -42,8 +42,8 @@ CREATE TABLE IF NOT EXISTS node(
|
|
|
42
42
|
|
|
43
43
|
SQL_CREATE_TABLE_CREDENTIAL = """
|
|
44
44
|
CREATE TABLE IF NOT EXISTS credential(
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
private_key BLOB PRIMARY KEY,
|
|
46
|
+
public_key BLOB
|
|
47
47
|
);
|
|
48
48
|
"""
|
|
49
49
|
|
|
@@ -589,20 +589,20 @@ class SqliteState(State): # pylint: disable=R0904
|
|
|
589
589
|
log(ERROR, "Unexpected run creation failure.")
|
|
590
590
|
return 0
|
|
591
591
|
|
|
592
|
-
def
|
|
593
|
-
self,
|
|
592
|
+
def store_server_private_public_key(
|
|
593
|
+
self, private_key: bytes, public_key: bytes
|
|
594
594
|
) -> None:
|
|
595
|
-
"""Store `
|
|
595
|
+
"""Store `server_private_key` and `server_public_key` in state."""
|
|
596
596
|
query = "SELECT COUNT(*) FROM credential"
|
|
597
597
|
count = self.query(query)[0]["COUNT(*)"]
|
|
598
598
|
if count < 1:
|
|
599
599
|
query = (
|
|
600
|
-
"INSERT OR REPLACE INTO credential (
|
|
601
|
-
"VALUES (:
|
|
600
|
+
"INSERT OR REPLACE INTO credential (private_key, public_key) "
|
|
601
|
+
"VALUES (:private_key, :public_key)"
|
|
602
602
|
)
|
|
603
|
-
self.query(query, {"
|
|
603
|
+
self.query(query, {"private_key": private_key, "public_key": public_key})
|
|
604
604
|
else:
|
|
605
|
-
raise RuntimeError("Server
|
|
605
|
+
raise RuntimeError("Server private and public key already set")
|
|
606
606
|
|
|
607
607
|
def get_server_private_key(self) -> Optional[bytes]:
|
|
608
608
|
"""Retrieve `server_private_key` in urlsafe bytes."""
|
|
@@ -172,10 +172,10 @@ class State(abc.ABC):
|
|
|
172
172
|
"""
|
|
173
173
|
|
|
174
174
|
@abc.abstractmethod
|
|
175
|
-
def
|
|
176
|
-
self,
|
|
175
|
+
def store_server_private_public_key(
|
|
176
|
+
self, private_key: bytes, public_key: bytes
|
|
177
177
|
) -> None:
|
|
178
|
-
"""Store `
|
|
178
|
+
"""Store `server_private_key` and `server_public_key` in state."""
|
|
179
179
|
|
|
180
180
|
@abc.abstractmethod
|
|
181
181
|
def get_server_private_key(self) -> Optional[bytes]:
|
|
@@ -28,7 +28,7 @@ import grpc
|
|
|
28
28
|
|
|
29
29
|
from flwr.client import ClientApp
|
|
30
30
|
from flwr.common import EventType, event, log
|
|
31
|
-
from flwr.common.logger import set_logger_propagation
|
|
31
|
+
from flwr.common.logger import set_logger_propagation, update_console_handler
|
|
32
32
|
from flwr.common.typing import ConfigsRecordValues
|
|
33
33
|
from flwr.server.driver import Driver, GrpcDriver
|
|
34
34
|
from flwr.server.run_serverapp import run
|
|
@@ -318,9 +318,9 @@ def _run_simulation(
|
|
|
318
318
|
enabled, DEBUG-level logs will be displayed.
|
|
319
319
|
"""
|
|
320
320
|
# Set logging level
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
321
|
+
logger = logging.getLogger("flwr")
|
|
322
|
+
if verbose_logging:
|
|
323
|
+
update_console_handler(level=DEBUG, timestamps=True, colored=True)
|
|
324
324
|
|
|
325
325
|
if backend_config is None:
|
|
326
326
|
backend_config = {}
|
{flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/RECORD
RENAMED
|
@@ -69,7 +69,7 @@ flwr/common/differential_privacy_constants.py,sha256=c7b7tqgvT7yMK0XN9ndiTBs4mQf
|
|
|
69
69
|
flwr/common/dp.py,sha256=Hc3lLHihjexbJaD_ft31gdv9XRcwOTgDBwJzICuok3A,2004
|
|
70
70
|
flwr/common/exit_handlers.py,sha256=2Nt0wLhc17KQQsLPFSRAjjhUiEFfJK6tNozdGiIY4Fs,2812
|
|
71
71
|
flwr/common/grpc.py,sha256=Yx_YFK24cU4U81RpXrdVwEVY_jTy4RE19cHtBxE2XOE,2460
|
|
72
|
-
flwr/common/logger.py,sha256=
|
|
72
|
+
flwr/common/logger.py,sha256=bFu4eOychVwwYwaaCtxQ85dmx8gUtvwp6fRk-GefXHk,7107
|
|
73
73
|
flwr/common/message.py,sha256=78SN-HZpqbsnap5JFbdnmqR1dL0juK1zDRiixg3Jbl4,12686
|
|
74
74
|
flwr/common/object_ref.py,sha256=ELoUCAFO-vbjJC41CGpa-WBG2SLYe3ErW-d9YCG3zqA,4961
|
|
75
75
|
flwr/common/parameter.py,sha256=-bFAUayToYDF50FZGrBC1hQYJCQDtB2bbr3ZuVLMtdE,2095
|
|
@@ -126,7 +126,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
|
|
|
126
126
|
flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
|
|
127
127
|
flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
128
|
flwr/server/__init__.py,sha256=dNLbXIERZ6X9aA_Bit3R9AARwcaZZzEfDuFmEx8VVOE,1785
|
|
129
|
-
flwr/server/app.py,sha256=
|
|
129
|
+
flwr/server/app.py,sha256=RUSgmhMm-U5FVZo3jk59t4o6v0JU-Y8avs_yVDHKWJM,28600
|
|
130
130
|
flwr/server/client_manager.py,sha256=T8UDSRJBVD3fyIDI7NTAA-NA7GPrMNNgH2OAF54RRxE,6127
|
|
131
131
|
flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
|
|
132
132
|
flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
|
|
@@ -179,7 +179,7 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=kuD7R1yB1Ite0s
|
|
|
179
179
|
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=_zWknjP7CRjwLDvofzmv1QoSI8Qq1cZC5nNw9nkSS7I,11932
|
|
180
180
|
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=bEJOMWbSlqkw-y5ZHtEXczhoSlAxErcRYffmTMQAV8M,758
|
|
181
181
|
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=YGn1IPpuX-6NDgaG1UbyREbI9iAyKDimZuNeWxbG6s0,3387
|
|
182
|
-
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=
|
|
182
|
+
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=5PpqauKY1SzTtR9Nj7R1L_gYG6xgWmEAXCpNrj3YeEg,5994
|
|
183
183
|
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=hEY0l61ojH8Iz30_K1btm1HJ6J49iZJSFUsVYqUTw3A,731
|
|
184
184
|
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=lG3BkiONcikDVowK0An06V7p2SNkwGbWE5hfN2xlsZw,3622
|
|
185
185
|
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=VKDvDq5H8koOUztpmQacVzGJXPLEEkL1Vmolxt3mvnY,735
|
|
@@ -190,9 +190,9 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LJsKl7oixVvptcG98Rd9ej
|
|
|
190
190
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=TaT2EpbVEsIY0EDzF8obadyZaSXjD38TFGdDPI-ytD0,6375
|
|
191
191
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=c2J2m6v1jDyuAhiBArdZNIk4cbiZNFJkpKlBJFEQq-c,12454
|
|
192
192
|
flwr/server/superlink/state/__init__.py,sha256=ij-7Ms-hyordQdRmGQxY1-nVa4OhixJ0jr7_YDkys0s,1003
|
|
193
|
-
flwr/server/superlink/state/in_memory_state.py,sha256=
|
|
194
|
-
flwr/server/superlink/state/sqlite_state.py,sha256=
|
|
195
|
-
flwr/server/superlink/state/state.py,sha256=
|
|
193
|
+
flwr/server/superlink/state/in_memory_state.py,sha256=TmMWlrvCk2378mdxHERkc0I_S5CLcYeT1sEmZMPfSFQ,11651
|
|
194
|
+
flwr/server/superlink/state/sqlite_state.py,sha256=ri-qgaMVxKzdmJBX2DBpSypfdZJ5eixAyZswZiM3x2w,27167
|
|
195
|
+
flwr/server/superlink/state/state.py,sha256=frqF0_rS56jsCDyZdW02YdYB94A6TfTuFhHYwP0WUqs,7709
|
|
196
196
|
flwr/server/superlink/state/state_factory.py,sha256=91cSB-KOAFM37z7T098WxTkVeKNaAZ_mTI75snn2_tk,1654
|
|
197
197
|
flwr/server/superlink/state/utils.py,sha256=qhIjBu5_rqm9GLMB6QS5TIRrMDVs85lmY17BqZ1ccLk,2207
|
|
198
198
|
flwr/server/typing.py,sha256=2zSG-KuDAgwFPuzgVjTLDaEqJ8gXXGqFR2RD-qIk730,913
|
|
@@ -211,9 +211,9 @@ flwr/simulation/ray_transport/__init__.py,sha256=FsaAnzC4cw4DqoouBCix6496k29jACk
|
|
|
211
211
|
flwr/simulation/ray_transport/ray_actor.py,sha256=_wv2eP7qxkCZ-6rMyYWnjLrGPBZRxjvTPjaVk8zIaQ4,19367
|
|
212
212
|
flwr/simulation/ray_transport/ray_client_proxy.py,sha256=oDu4sEPIOu39vrNi-fqDAe10xtNUXMO49bM2RWfRcyw,6738
|
|
213
213
|
flwr/simulation/ray_transport/utils.py,sha256=TYdtfg1P9VfTdLMOJlifInGpxWHYs9UfUqIv2wfkRLA,2392
|
|
214
|
-
flwr/simulation/run_simulation.py,sha256=
|
|
215
|
-
flwr_nightly-1.9.0.
|
|
216
|
-
flwr_nightly-1.9.0.
|
|
217
|
-
flwr_nightly-1.9.0.
|
|
218
|
-
flwr_nightly-1.9.0.
|
|
219
|
-
flwr_nightly-1.9.0.
|
|
214
|
+
flwr/simulation/run_simulation.py,sha256=LszcnkCLM9YE-kgezB_H7b_NdDrK_Q0yN24mqYtZdfI,15957
|
|
215
|
+
flwr_nightly-1.9.0.dev20240503.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
216
|
+
flwr_nightly-1.9.0.dev20240503.dist-info/METADATA,sha256=S9BjsRoM_sgU4CFVZDPoxnKocULT0POUWulJBBcyfuY,15303
|
|
217
|
+
flwr_nightly-1.9.0.dev20240503.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
218
|
+
flwr_nightly-1.9.0.dev20240503.dist-info/entry_points.txt,sha256=8JJPfpqMnXz9c5V_FSt07Xwd-wCWbAO3MFUDXQ5ZGsI,378
|
|
219
|
+
flwr_nightly-1.9.0.dev20240503.dist-info/RECORD,,
|
{flwr_nightly-1.9.0.dev20240501.dist-info → flwr_nightly-1.9.0.dev20240503.dist-info}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|