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 CHANGED
@@ -82,13 +82,20 @@ class ConsoleHandler(StreamHandler):
82
82
  return formatter.format(record)
83
83
 
84
84
 
85
- def update_console_handler(level: int, timestamps: bool, colored: bool) -> None:
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
- handler.setLevel(level)
90
- handler.timestamps = timestamps
91
- handler.colored = colored
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
- interceptors = [
378
- AuthenticateServerInterceptor(
379
- client_public_keys,
380
- server_private_key,
381
- server_public_key,
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 INFO
20
- from typing import Any, Callable, Sequence, Set, Tuple, Union
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
- client_public_keys: Set[bytes],
85
- private_key: ec.EllipticCurvePrivateKey,
86
- public_key: ec.EllipticCurvePublicKey,
87
- ):
88
- self.server_private_key = private_key
89
- self.client_public_keys = client_public_keys
90
- self.encoded_server_public_key = base64.urlsafe_b64encode(
91
- public_key_to_bytes(public_key)
92
- )
93
- log(
94
- INFO,
95
- "Client authentication enabled with %d known public keys",
96
- len(client_public_keys),
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 store_server_public_private_key(
258
- self, public_key: bytes, private_key: bytes
257
+ def store_server_private_public_key(
258
+ self, private_key: bytes, public_key: bytes
259
259
  ) -> None:
260
- """Store `server_public_key` and `server_private_key` in state."""
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 public and private key already set")
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
- public_key BLOB PRIMARY KEY,
46
- private_key BLOB
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 store_server_public_private_key(
593
- self, public_key: bytes, private_key: bytes
592
+ def store_server_private_public_key(
593
+ self, private_key: bytes, public_key: bytes
594
594
  ) -> None:
595
- """Store `server_public_key` and `server_private_key` in state."""
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 (public_key, private_key) "
601
- "VALUES (:public_key, :private_key)"
600
+ "INSERT OR REPLACE INTO credential (private_key, public_key) "
601
+ "VALUES (:private_key, :public_key)"
602
602
  )
603
- self.query(query, {"public_key": public_key, "private_key": private_key})
603
+ self.query(query, {"private_key": private_key, "public_key": public_key})
604
604
  else:
605
- raise RuntimeError("Server public and private key already set")
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 store_server_public_private_key(
176
- self, public_key: bytes, private_key: bytes
175
+ def store_server_private_public_key(
176
+ self, private_key: bytes, public_key: bytes
177
177
  ) -> None:
178
- """Store `server_public_key` and `server_private_key` in state."""
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
- if not verbose_logging:
322
- logger = logging.getLogger("flwr")
323
- logger.setLevel(INFO)
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 = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240501
3
+ Version: 1.9.0.dev20240503
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -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=s1ZTh6nCeGZh0MxbCG8zHYZAeQ9JNDpw8k6qtxSCCzM,6920
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=W5AzN9Gg3nQVnekXgCOzpN3dlpP3T-oh-N2ugdfuF7o,28282
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=3EuoVOb5pXrN52XlDGjEfJdXYmcfFunZeYYMlDlu7ug,5902
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=d6T6NXGyvo53LnFJSRRsiCnFOXikYMmCcCUmiarOuD0,11651
194
- flwr/server/superlink/state/sqlite_state.py,sha256=eU5Ll6V0yQp9fnZbo5L-i0BM41SkmjK7kHzc1EHNr_M,27167
195
- flwr/server/superlink/state/state.py,sha256=bdEqkjfBbVtbT_YudaMFFLSR-q_R1q-tsvjdni3YJKg,7709
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=jSzL7vZJ6Cg76yAyuWt7X8WzwkZ26krpurRAIHXhrNk,15896
215
- flwr_nightly-1.9.0.dev20240501.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
216
- flwr_nightly-1.9.0.dev20240501.dist-info/METADATA,sha256=xx9zVqrtYze9IkQZ6S2obortCJOalnsGcQnuhStB9Fs,15303
217
- flwr_nightly-1.9.0.dev20240501.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
218
- flwr_nightly-1.9.0.dev20240501.dist-info/entry_points.txt,sha256=8JJPfpqMnXz9c5V_FSt07Xwd-wCWbAO3MFUDXQ5ZGsI,378
219
- flwr_nightly-1.9.0.dev20240501.dist-info/RECORD,,
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,,