flwr-nightly 1.23.0.dev20251002__py3-none-any.whl → 1.23.0.dev20251003__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.
@@ -15,7 +15,7 @@
15
15
  """Flower account auth plugins."""
16
16
 
17
17
 
18
- from flwr.common.constant import AuthType
18
+ from flwr.common.constant import AuthnType
19
19
 
20
20
  from .auth_plugin import CliAuthPlugin, LoginError
21
21
  from .noop_auth_plugin import NoOpCliAuthPlugin
@@ -24,7 +24,7 @@ from .oidc_cli_plugin import OidcCliPlugin
24
24
 
25
25
  def get_cli_auth_plugins() -> dict[str, type[CliAuthPlugin]]:
26
26
  """Return all CLI authentication plugins."""
27
- return {AuthType.NOOP: NoOpCliAuthPlugin, AuthType.OIDC: OidcCliPlugin}
27
+ return {AuthnType.NOOP: NoOpCliAuthPlugin, AuthnType.OIDC: OidcCliPlugin}
28
28
 
29
29
 
30
30
  __all__ = [
@@ -25,9 +25,9 @@ import typer
25
25
 
26
26
  from flwr.common.constant import (
27
27
  ACCESS_TOKEN_KEY,
28
- AUTH_TYPE_JSON_KEY,
28
+ AUTHN_TYPE_JSON_KEY,
29
29
  REFRESH_TOKEN_KEY,
30
- AuthType,
30
+ AuthnType,
31
31
  )
32
32
  from flwr.common.typing import AccountAuthCredentials, AccountAuthLoginDetails
33
33
  from flwr.proto.control_pb2 import ( # pylint: disable=E0611
@@ -88,7 +88,7 @@ class OidcCliPlugin(CliAuthPlugin):
88
88
  self.access_token = credentials.access_token
89
89
  self.refresh_token = credentials.refresh_token
90
90
  json_dict = {
91
- AUTH_TYPE_JSON_KEY: AuthType.OIDC,
91
+ AUTHN_TYPE_JSON_KEY: AuthnType.OIDC,
92
92
  ACCESS_TOKEN_KEY: credentials.access_token,
93
93
  REFRESH_TOKEN_KEY: credentials.refresh_token,
94
94
  }
flwr/cli/login/login.py CHANGED
@@ -73,7 +73,7 @@ def login( # pylint: disable=R0914
73
73
  )
74
74
  exit_if_no_address(federation_config, "login")
75
75
 
76
- # Check if `enable-user-auth` is set to `true`
76
+ # Check if `enable-account-auth` is set to `true`
77
77
 
78
78
  if not account_auth_enabled(federation_config):
79
79
  typer.secho(
@@ -103,13 +103,13 @@ def login( # pylint: disable=R0914
103
103
  login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
104
104
 
105
105
  # Get the auth plugin
106
- auth_type = login_response.auth_type
106
+ authn_type = login_response.authn_type
107
107
  auth_plugin = try_obtain_cli_auth_plugin(
108
- app, federation, federation_config, auth_type
108
+ app, federation, federation_config, authn_type
109
109
  )
110
110
  if auth_plugin is None:
111
111
  typer.secho(
112
- f'❌ Authentication type "{auth_type}" not found',
112
+ f'❌ Authentication type "{authn_type}" not found',
113
113
  fg=typer.colors.RED,
114
114
  bold=True,
115
115
  )
@@ -117,7 +117,7 @@ def login( # pylint: disable=R0914
117
117
 
118
118
  # Login
119
119
  details = AccountAuthLoginDetails(
120
- auth_type=login_response.auth_type,
120
+ authn_type=login_response.authn_type,
121
121
  device_code=login_response.device_code,
122
122
  verification_uri_complete=login_response.verification_uri_complete,
123
123
  expires_in=login_response.expires_in,
flwr/cli/utils.py CHANGED
@@ -27,7 +27,7 @@ import grpc
27
27
  import typer
28
28
 
29
29
  from flwr.common.constant import (
30
- AUTH_TYPE_JSON_KEY,
30
+ AUTHN_TYPE_JSON_KEY,
31
31
  CREDENTIALS_DIR,
32
32
  FLWR_DIR,
33
33
  NO_ACCOUNT_AUTH_MESSAGE,
@@ -234,22 +234,22 @@ def try_obtain_cli_auth_plugin(
234
234
  root_dir: Path,
235
235
  federation: str,
236
236
  federation_config: dict[str, Any],
237
- auth_type: Optional[str] = None,
237
+ authn_type: Optional[str] = None,
238
238
  ) -> Optional[CliAuthPlugin]:
239
- """Load the CLI-side account auth plugin for the given auth type."""
239
+ """Load the CLI-side account auth plugin for the given authn type."""
240
240
  # Check if account auth is enabled
241
241
  if not account_auth_enabled(federation_config):
242
242
  return None
243
243
 
244
244
  config_path = get_account_auth_config_path(root_dir, federation)
245
245
 
246
- # Get the auth type from the config if not provided
247
- # auth_type will be None for all CLI commands except login
248
- if auth_type is None:
246
+ # Get the authn type from the config if not provided
247
+ # authn_type will be None for all CLI commands except login
248
+ if authn_type is None:
249
249
  try:
250
250
  with config_path.open("r", encoding="utf-8") as file:
251
251
  json_file = json.load(file)
252
- auth_type = json_file[AUTH_TYPE_JSON_KEY]
252
+ authn_type = json_file[AUTHN_TYPE_JSON_KEY]
253
253
  except (FileNotFoundError, KeyError):
254
254
  typer.secho(
255
255
  "❌ Missing or invalid credentials for account authentication. "
@@ -262,10 +262,10 @@ def try_obtain_cli_auth_plugin(
262
262
  # Retrieve auth plugin class and instantiate it
263
263
  try:
264
264
  all_plugins: dict[str, type[CliAuthPlugin]] = get_cli_auth_plugins()
265
- auth_plugin_class = all_plugins[auth_type]
265
+ auth_plugin_class = all_plugins[authn_type]
266
266
  return auth_plugin_class(config_path)
267
267
  except KeyError:
268
- typer.echo(f"❌ Unknown account authentication type: {auth_type}")
268
+ typer.echo(f"❌ Unknown account authentication type: {authn_type}")
269
269
  raise typer.Exit(code=1) from None
270
270
  except ImportError:
271
271
  typer.echo("❌ No authentication plugins are currently supported.")
flwr/common/constant.py CHANGED
@@ -111,8 +111,8 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
111
111
 
112
112
  # Constants for account authentication
113
113
  CREDENTIALS_DIR = ".credentials"
114
- AUTH_TYPE_JSON_KEY = "auth-type" # For key name in JSON file
115
- AUTH_TYPE_YAML_KEY = "auth_type" # For key name in YAML file
114
+ AUTHN_TYPE_JSON_KEY = "authn-type" # For key name in JSON file
115
+ AUTHN_TYPE_YAML_KEY = "authn_type" # For key name in YAML file
116
116
  ACCESS_TOKEN_KEY = "flwr-oidc-access-token"
117
117
  REFRESH_TOKEN_KEY = "flwr-oidc-refresh-token"
118
118
 
@@ -245,13 +245,13 @@ class CliOutputFormat:
245
245
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
246
246
 
247
247
 
248
- class AuthType:
248
+ class AuthnType:
249
249
  """Account authentication types."""
250
250
 
251
251
  NOOP = "noop"
252
252
  OIDC = "oidc"
253
253
 
254
- def __new__(cls) -> AuthType:
254
+ def __new__(cls) -> AuthnType:
255
255
  """Prevent instantiation."""
256
256
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
257
257
 
flwr/common/typing.py CHANGED
@@ -275,7 +275,7 @@ class InvalidRunStatusException(BaseException):
275
275
  class AccountAuthLoginDetails:
276
276
  """Account authentication login details."""
277
277
 
278
- auth_type: str
278
+ authn_type: str
279
279
  device_code: str
280
280
  verification_uri_complete: str
281
281
  expires_in: int
flwr/proto/control_pb2.py CHANGED
@@ -19,7 +19,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
19
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
20
20
 
21
21
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8a\x01\n\x17GetLoginDetailsResponse\x12\x11\n\tauth_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\"*\n\x14\x43reateNodeCliRequest\x12\x12\n\npublic_key\x18\x01 \x01(\t\"9\n\x15\x43reateNodeCliResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"\'\n\x14\x44\x65leteNodeCliRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x17\n\x15\x44\x65leteNodeCliResponse\"\x15\n\x13ListNodesCliRequest\"M\n\x14ListNodesCliResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xc5\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12V\n\rCreateNodeCli\x12 .flwr.proto.CreateNodeCliRequest\x1a!.flwr.proto.CreateNodeCliResponse\"\x00\x12V\n\rDeleteNodeCli\x12 .flwr.proto.DeleteNodeCliRequest\x1a!.flwr.proto.DeleteNodeCliResponse\"\x00\x12S\n\x0cListNodesCli\x12\x1f.flwr.proto.ListNodesCliRequest\x1a .flwr.proto.ListNodesCliResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\"*\n\x14\x43reateNodeCliRequest\x12\x12\n\npublic_key\x18\x01 \x01(\t\"9\n\x15\x43reateNodeCliResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"\'\n\x14\x44\x65leteNodeCliRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x17\n\x15\x44\x65leteNodeCliResponse\"\x15\n\x13ListNodesCliRequest\"M\n\x14ListNodesCliResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xc5\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12V\n\rCreateNodeCli\x12 .flwr.proto.CreateNodeCliRequest\x1a!.flwr.proto.CreateNodeCliResponse\"\x00\x12V\n\rDeleteNodeCli\x12 .flwr.proto.DeleteNodeCliRequest\x1a!.flwr.proto.DeleteNodeCliResponse\"\x00\x12S\n\x0cListNodesCli\x12\x1f.flwr.proto.ListNodesCliRequest\x1a .flwr.proto.ListNodesCliResponse\"\x00\x62\x06proto3')
23
23
 
24
24
  _globals = globals()
25
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -49,31 +49,31 @@ if _descriptor._USE_C_DESCRIPTORS == False:
49
49
  _globals['_GETLOGINDETAILSREQUEST']._serialized_start=810
50
50
  _globals['_GETLOGINDETAILSREQUEST']._serialized_end=834
51
51
  _globals['_GETLOGINDETAILSRESPONSE']._serialized_start=837
52
- _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=975
53
- _globals['_GETAUTHTOKENSREQUEST']._serialized_start=977
54
- _globals['_GETAUTHTOKENSREQUEST']._serialized_end=1020
55
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=1022
56
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1090
57
- _globals['_STOPRUNREQUEST']._serialized_start=1092
58
- _globals['_STOPRUNREQUEST']._serialized_end=1124
59
- _globals['_STOPRUNRESPONSE']._serialized_start=1126
60
- _globals['_STOPRUNRESPONSE']._serialized_end=1160
61
- _globals['_PULLARTIFACTSREQUEST']._serialized_start=1162
62
- _globals['_PULLARTIFACTSREQUEST']._serialized_end=1200
63
- _globals['_PULLARTIFACTSRESPONSE']._serialized_start=1202
64
- _globals['_PULLARTIFACTSRESPONSE']._serialized_end=1251
65
- _globals['_CREATENODECLIREQUEST']._serialized_start=1253
66
- _globals['_CREATENODECLIREQUEST']._serialized_end=1295
67
- _globals['_CREATENODECLIRESPONSE']._serialized_start=1297
68
- _globals['_CREATENODECLIRESPONSE']._serialized_end=1354
69
- _globals['_DELETENODECLIREQUEST']._serialized_start=1356
70
- _globals['_DELETENODECLIREQUEST']._serialized_end=1395
71
- _globals['_DELETENODECLIRESPONSE']._serialized_start=1397
72
- _globals['_DELETENODECLIRESPONSE']._serialized_end=1420
73
- _globals['_LISTNODESCLIREQUEST']._serialized_start=1422
74
- _globals['_LISTNODESCLIREQUEST']._serialized_end=1443
75
- _globals['_LISTNODESCLIRESPONSE']._serialized_start=1445
76
- _globals['_LISTNODESCLIRESPONSE']._serialized_end=1522
77
- _globals['_CONTROL']._serialized_start=1525
78
- _globals['_CONTROL']._serialized_end=2362
52
+ _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=976
53
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_start=978
54
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_end=1021
55
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=1023
56
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1091
57
+ _globals['_STOPRUNREQUEST']._serialized_start=1093
58
+ _globals['_STOPRUNREQUEST']._serialized_end=1125
59
+ _globals['_STOPRUNRESPONSE']._serialized_start=1127
60
+ _globals['_STOPRUNRESPONSE']._serialized_end=1161
61
+ _globals['_PULLARTIFACTSREQUEST']._serialized_start=1163
62
+ _globals['_PULLARTIFACTSREQUEST']._serialized_end=1201
63
+ _globals['_PULLARTIFACTSRESPONSE']._serialized_start=1203
64
+ _globals['_PULLARTIFACTSRESPONSE']._serialized_end=1252
65
+ _globals['_CREATENODECLIREQUEST']._serialized_start=1254
66
+ _globals['_CREATENODECLIREQUEST']._serialized_end=1296
67
+ _globals['_CREATENODECLIRESPONSE']._serialized_start=1298
68
+ _globals['_CREATENODECLIRESPONSE']._serialized_end=1355
69
+ _globals['_DELETENODECLIREQUEST']._serialized_start=1357
70
+ _globals['_DELETENODECLIREQUEST']._serialized_end=1396
71
+ _globals['_DELETENODECLIRESPONSE']._serialized_start=1398
72
+ _globals['_DELETENODECLIRESPONSE']._serialized_end=1421
73
+ _globals['_LISTNODESCLIREQUEST']._serialized_start=1423
74
+ _globals['_LISTNODESCLIREQUEST']._serialized_end=1444
75
+ _globals['_LISTNODESCLIRESPONSE']._serialized_start=1446
76
+ _globals['_LISTNODESCLIRESPONSE']._serialized_end=1523
77
+ _globals['_CONTROL']._serialized_start=1526
78
+ _globals['_CONTROL']._serialized_end=2363
79
79
  # @@protoc_insertion_point(module_scope)
@@ -144,25 +144,25 @@ global___GetLoginDetailsRequest = GetLoginDetailsRequest
144
144
 
145
145
  class GetLoginDetailsResponse(google.protobuf.message.Message):
146
146
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
147
- AUTH_TYPE_FIELD_NUMBER: builtins.int
147
+ AUTHN_TYPE_FIELD_NUMBER: builtins.int
148
148
  DEVICE_CODE_FIELD_NUMBER: builtins.int
149
149
  VERIFICATION_URI_COMPLETE_FIELD_NUMBER: builtins.int
150
150
  EXPIRES_IN_FIELD_NUMBER: builtins.int
151
151
  INTERVAL_FIELD_NUMBER: builtins.int
152
- auth_type: typing.Text
152
+ authn_type: typing.Text
153
153
  device_code: typing.Text
154
154
  verification_uri_complete: typing.Text
155
155
  expires_in: builtins.int
156
156
  interval: builtins.int
157
157
  def __init__(self,
158
158
  *,
159
- auth_type: typing.Text = ...,
159
+ authn_type: typing.Text = ...,
160
160
  device_code: typing.Text = ...,
161
161
  verification_uri_complete: typing.Text = ...,
162
162
  expires_in: builtins.int = ...,
163
163
  interval: builtins.int = ...,
164
164
  ) -> None: ...
165
- def ClearField(self, field_name: typing_extensions.Literal["auth_type",b"auth_type","device_code",b"device_code","expires_in",b"expires_in","interval",b"interval","verification_uri_complete",b"verification_uri_complete"]) -> None: ...
165
+ def ClearField(self, field_name: typing_extensions.Literal["authn_type",b"authn_type","device_code",b"device_code","expires_in",b"expires_in","interval",b"interval","verification_uri_complete",b"verification_uri_complete"]) -> None: ...
166
166
  global___GetLoginDetailsResponse = GetLoginDetailsResponse
167
167
 
168
168
  class GetAuthTokensRequest(google.protobuf.message.Message):
flwr/server/app.py CHANGED
@@ -38,7 +38,7 @@ from flwr.common.address import parse_address
38
38
  from flwr.common.args import try_obtain_server_certificates
39
39
  from flwr.common.config import get_flwr_dir
40
40
  from flwr.common.constant import (
41
- AUTH_TYPE_YAML_KEY,
41
+ AUTHN_TYPE_YAML_KEY,
42
42
  AUTHZ_TYPE_YAML_KEY,
43
43
  CLIENT_OCTET,
44
44
  CONTROL_API_DEFAULT_SERVER_ADDRESS,
@@ -193,7 +193,7 @@ def run_superlink() -> None:
193
193
  # provided
194
194
  verify_tls_cert = not getattr(args, "disable_oidc_tls_cert_verification", None)
195
195
 
196
- auth_plugin: Optional[ControlAuthnPlugin] = None
196
+ authn_plugin: Optional[ControlAuthnPlugin] = None
197
197
  authz_plugin: Optional[ControlAuthzPlugin] = None
198
198
  event_log_plugin: Optional[EventLogWriterPlugin] = None
199
199
  # Load the auth plugin if the args.account_auth_config is provided
@@ -205,7 +205,7 @@ def run_superlink() -> None:
205
205
  )
206
206
  args.account_auth_config = cfg_path
207
207
  if cfg_path := getattr(args, "account_auth_config", None):
208
- auth_plugin, authz_plugin = _try_obtain_control_auth_plugins(
208
+ authn_plugin, authz_plugin = _try_obtain_control_auth_plugins(
209
209
  Path(cfg_path), verify_tls_cert
210
210
  )
211
211
  # Enable event logging if the args.enable_event_log is True
@@ -236,7 +236,7 @@ def run_superlink() -> None:
236
236
  objectstore_factory=objectstore_factory,
237
237
  certificates=certificates,
238
238
  is_simulation=is_simulation,
239
- auth_plugin=auth_plugin,
239
+ authn_plugin=authn_plugin,
240
240
  authz_plugin=authz_plugin,
241
241
  event_log_plugin=event_log_plugin,
242
242
  artifact_provider=artifact_provider,
@@ -478,10 +478,21 @@ def _try_obtain_control_auth_plugins(
478
478
  except NotImplementedError:
479
479
  sys.exit(f"No {section} plugins are currently supported.")
480
480
 
481
+ # Warn deprecated authn_type key
482
+ if "authn_type" in config["authentication"]:
483
+ log(
484
+ WARN,
485
+ "The `authn_type` key in the authentication configuration is deprecated. "
486
+ "Use `%s` instead.",
487
+ AUTHN_TYPE_YAML_KEY,
488
+ )
489
+ authn_type = config["authentication"].pop("authn_type")
490
+ config["authentication"][AUTHN_TYPE_YAML_KEY] = authn_type
491
+
481
492
  # Load authentication plugin
482
- auth_plugin = _load_plugin(
493
+ authn_plugin = _load_plugin(
483
494
  section="authentication",
484
- yaml_key=AUTH_TYPE_YAML_KEY,
495
+ yaml_key=AUTHN_TYPE_YAML_KEY,
485
496
  loader=get_control_authn_plugins,
486
497
  )
487
498
 
@@ -492,7 +503,7 @@ def _try_obtain_control_auth_plugins(
492
503
  loader=get_control_authz_plugins,
493
504
  )
494
505
 
495
- return auth_plugin, authz_plugin
506
+ return authn_plugin, authz_plugin
496
507
 
497
508
 
498
509
  def _try_obtain_control_event_log_writer_plugin() -> Optional[EventLogWriterPlugin]:
@@ -20,7 +20,7 @@ from collections.abc import Sequence
20
20
  from pathlib import Path
21
21
  from typing import Optional, Union
22
22
 
23
- from flwr.common.constant import NOOP_ACCOUNT_NAME, NOOP_FLWR_AID, AuthType
23
+ from flwr.common.constant import NOOP_ACCOUNT_NAME, NOOP_FLWR_AID, AuthnType
24
24
  from flwr.common.typing import (
25
25
  AccountAuthCredentials,
26
26
  AccountAuthLoginDetails,
@@ -50,7 +50,7 @@ class NoOpControlAuthnPlugin(ControlAuthnPlugin):
50
50
  # This allows the `flwr login` command to load the NoOp plugin accordingly,
51
51
  # which then raises a LoginError when attempting to login.
52
52
  return AccountAuthLoginDetails(
53
- auth_type=AuthType.NOOP, # No operation auth type
53
+ authn_type=AuthnType.NOOP, # No operation authn type
54
54
  device_code="",
55
55
  verification_uri_complete="",
56
56
  expires_in=0,
@@ -55,10 +55,10 @@ class ControlAccountAuthInterceptor(grpc.ServerInterceptor): # type: ignore
55
55
 
56
56
  def __init__(
57
57
  self,
58
- auth_plugin: ControlAuthnPlugin,
58
+ authn_plugin: ControlAuthnPlugin,
59
59
  authz_plugin: ControlAuthzPlugin,
60
60
  ):
61
- self.auth_plugin = auth_plugin
61
+ self.authn_plugin = authn_plugin
62
62
  self.authz_plugin = authz_plugin
63
63
 
64
64
  def intercept_service(
@@ -97,7 +97,7 @@ class ControlAccountAuthInterceptor(grpc.ServerInterceptor): # type: ignore
97
97
  return call(request, context) # type: ignore
98
98
 
99
99
  # For other requests, check if the account is authenticated
100
- valid_tokens, account_info = self.auth_plugin.validate_tokens_in_metadata(
100
+ valid_tokens, account_info = self.authn_plugin.validate_tokens_in_metadata(
101
101
  metadata
102
102
  )
103
103
  if valid_tokens:
@@ -120,7 +120,7 @@ class ControlAccountAuthInterceptor(grpc.ServerInterceptor): # type: ignore
120
120
  return call(request, context) # type: ignore
121
121
 
122
122
  # If the account is not authenticated, refresh tokens
123
- tokens, account_info = self.auth_plugin.refresh_tokens(metadata)
123
+ tokens, account_info = self.authn_plugin.refresh_tokens(metadata)
124
124
  if tokens is not None:
125
125
  if account_info is None:
126
126
  context.abort(
@@ -54,7 +54,7 @@ def run_control_api_grpc(
54
54
  objectstore_factory: ObjectStoreFactory,
55
55
  certificates: Optional[tuple[bytes, bytes, bytes]],
56
56
  is_simulation: bool,
57
- auth_plugin: Optional[ControlAuthnPlugin] = None,
57
+ authn_plugin: Optional[ControlAuthnPlugin] = None,
58
58
  authz_plugin: Optional[ControlAuthzPlugin] = None,
59
59
  event_log_plugin: Optional[EventLogWriterPlugin] = None,
60
60
  artifact_provider: Optional[ArtifactProvider] = None,
@@ -69,14 +69,14 @@ def run_control_api_grpc(
69
69
  ffs_factory=ffs_factory,
70
70
  objectstore_factory=objectstore_factory,
71
71
  is_simulation=is_simulation,
72
- auth_plugin=auth_plugin,
72
+ authn_plugin=authn_plugin,
73
73
  artifact_provider=artifact_provider,
74
74
  )
75
75
  interceptors: list[grpc.ServerInterceptor] = []
76
76
  if license_plugin is not None:
77
77
  interceptors.append(ControlLicenseInterceptor(license_plugin))
78
- if auth_plugin is not None and authz_plugin is not None:
79
- interceptors.append(ControlAccountAuthInterceptor(auth_plugin, authz_plugin))
78
+ if authn_plugin is not None and authz_plugin is not None:
79
+ interceptors.append(ControlAccountAuthInterceptor(authn_plugin, authz_plugin))
80
80
  # Event log interceptor must be added after account auth interceptor
81
81
  if event_log_plugin is not None:
82
82
  interceptors.append(ControlEventLogInterceptor(event_log_plugin))
@@ -90,7 +90,7 @@ def run_control_api_grpc(
90
90
  interceptors=interceptors or None,
91
91
  )
92
92
 
93
- if auth_plugin is None:
93
+ if authn_plugin is None:
94
94
  log(INFO, "Flower Deployment Runtime: Starting Control API on %s", address)
95
95
  else:
96
96
  log(
@@ -83,14 +83,14 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
83
83
  ffs_factory: FfsFactory,
84
84
  objectstore_factory: ObjectStoreFactory,
85
85
  is_simulation: bool,
86
- auth_plugin: Optional[ControlAuthnPlugin] = None,
86
+ authn_plugin: Optional[ControlAuthnPlugin] = None,
87
87
  artifact_provider: Optional[ArtifactProvider] = None,
88
88
  ) -> None:
89
89
  self.linkstate_factory = linkstate_factory
90
90
  self.ffs_factory = ffs_factory
91
91
  self.objectstore_factory = objectstore_factory
92
92
  self.is_simulation = is_simulation
93
- self.auth_plugin = auth_plugin
93
+ self.authn_plugin = authn_plugin
94
94
  self.artifact_provider = artifact_provider
95
95
 
96
96
  def StartRun( # pylint: disable=too-many-locals
@@ -109,7 +109,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
109
109
  )
110
110
  return StartRunResponse()
111
111
 
112
- flwr_aid = shared_account_info.get().flwr_aid if self.auth_plugin else None
112
+ flwr_aid = shared_account_info.get().flwr_aid if self.authn_plugin else None
113
113
  override_config = user_config_from_proto(request.override_config)
114
114
  federation_options = config_record_from_proto(request.federation_options)
115
115
  fab_file = request.fab.content
@@ -184,7 +184,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
184
184
  context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
185
185
 
186
186
  # If account auth is enabled, check if `flwr_aid` matches the run's `flwr_aid`
187
- if self.auth_plugin:
187
+ if self.authn_plugin:
188
188
  flwr_aid = shared_account_info.get().flwr_aid
189
189
  _check_flwr_aid_in_run(
190
190
  flwr_aid=flwr_aid, run=cast(Run, run), context=context
@@ -224,7 +224,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
224
224
 
225
225
  # Build a set of run IDs for `flwr ls --runs`
226
226
  if not request.HasField("run_id"):
227
- if self.auth_plugin:
227
+ if self.authn_plugin:
228
228
  # If no `run_id` is specified and account auth is enabled,
229
229
  # return run IDs for the authenticated account
230
230
  flwr_aid = shared_account_info.get().flwr_aid
@@ -250,7 +250,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
250
250
 
251
251
  # If account auth is enabled,
252
252
  # check if `flwr_aid` matches the run's `flwr_aid`
253
- if self.auth_plugin:
253
+ if self.authn_plugin:
254
254
  flwr_aid = shared_account_info.get().flwr_aid
255
255
  _check_flwr_aid_in_run(
256
256
  flwr_aid=flwr_aid, run=cast(Run, run), context=context
@@ -278,7 +278,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
278
278
  context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
279
279
 
280
280
  # If account auth is enabled, check if `flwr_aid` matches the run's `flwr_aid`
281
- if self.auth_plugin:
281
+ if self.authn_plugin:
282
282
  flwr_aid = shared_account_info.get().flwr_aid
283
283
  _check_flwr_aid_in_run(
284
284
  flwr_aid=flwr_aid, run=cast(Run, run), context=context
@@ -312,7 +312,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
312
312
  ) -> GetLoginDetailsResponse:
313
313
  """Start login."""
314
314
  log(INFO, "ControlServicer.GetLoginDetails")
315
- if self.auth_plugin is None:
315
+ if self.authn_plugin is None:
316
316
  context.abort(
317
317
  grpc.StatusCode.UNIMPLEMENTED,
318
318
  NO_ACCOUNT_AUTH_MESSAGE,
@@ -320,14 +320,14 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
320
320
  raise grpc.RpcError() # This line is unreachable
321
321
 
322
322
  # Get login details
323
- details = self.auth_plugin.get_login_details()
323
+ details = self.authn_plugin.get_login_details()
324
324
 
325
325
  # Return empty response if details is None
326
326
  if details is None:
327
327
  return GetLoginDetailsResponse()
328
328
 
329
329
  return GetLoginDetailsResponse(
330
- auth_type=details.auth_type,
330
+ authn_type=details.authn_type,
331
331
  device_code=details.device_code,
332
332
  verification_uri_complete=details.verification_uri_complete,
333
333
  expires_in=details.expires_in,
@@ -339,7 +339,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
339
339
  ) -> GetAuthTokensResponse:
340
340
  """Get auth token."""
341
341
  log(INFO, "ControlServicer.GetAuthTokens")
342
- if self.auth_plugin is None:
342
+ if self.authn_plugin is None:
343
343
  context.abort(
344
344
  grpc.StatusCode.UNIMPLEMENTED,
345
345
  NO_ACCOUNT_AUTH_MESSAGE,
@@ -347,7 +347,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
347
347
  raise grpc.RpcError() # This line is unreachable
348
348
 
349
349
  # Get auth tokens
350
- credentials = self.auth_plugin.get_auth_tokens(request.device_code)
350
+ credentials = self.authn_plugin.get_auth_tokens(request.device_code)
351
351
 
352
352
  # Return empty response if credentials is None
353
353
  if credentials is None:
@@ -391,7 +391,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
391
391
  )
392
392
 
393
393
  # Check if `flwr_aid` matches the run's `flwr_aid` when account auth is enabled
394
- if self.auth_plugin:
394
+ if self.authn_plugin:
395
395
  flwr_aid = shared_account_info.get().flwr_aid
396
396
  _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
397
397
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.23.0.dev20251002
3
+ Version: 1.23.0.dev20251003
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -5,10 +5,10 @@ flwr/app/exception.py,sha256=WX45Yviu_CmYrYd8JHNjRkSsb-g4Br7XvVLKuVxwSdI,1298
5
5
  flwr/app/metadata.py,sha256=rdMBn0zhIOYmCvmGENQWSQqDwcxwsMJzCle4PQdlc_Y,7331
6
6
  flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
7
7
  flwr/cli/app.py,sha256=tNSJcp8D3iVbWgyPF9rWO9lcYgsZMnXYVJunahRiQe8,2422
8
- flwr/cli/auth_plugin/__init__.py,sha256=6psuDYfU90YjeLjvRbBsf-t_fp99_znDzxY8ITc5TIE,1223
8
+ flwr/cli/auth_plugin/__init__.py,sha256=Hi4YiFWCFhm7G94N_RIF1OEapxpWy3SyUeXVXfJyZSY,1226
9
9
  flwr/cli/auth_plugin/auth_plugin.py,sha256=LK-DYGk8J85Mjsbc5BX9ueDVOOPcFSo9cKWJX25X-QI,3050
10
10
  flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=KRyxoYtrzOWAIlSuXznli9gqL-rmHSG3zESmYSCQ_rg,2093
11
- flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=HJv_co4kPz1GrYQg6D9bs0OQv0Q888qbz77hy8tX1-w,5143
11
+ flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=9Oyd23g-2vgsXhRQdqG9JNocPylGXZM4UVPBB6l0GXA,5147
12
12
  flwr/cli/build.py,sha256=hE54Q_eMdWLpVKSVC2aQaUxVaiUlWnAosGNvIPSEg6Y,7284
13
13
  flwr/cli/cli_account_auth_interceptor.py,sha256=o_D6-al3TgLRUAX2OZhzLlYF_LXDsK5dLkjbi082JNU,3131
14
14
  flwr/cli/config_utils.py,sha256=o75PJzgCTl9FdFo_I9OjCB02-ykK0VWZdhIAeR0A8QA,9130
@@ -17,7 +17,7 @@ flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
17
17
  flwr/cli/install.py,sha256=Jr883qR7qssVpUr3hEOEcLK-dfW67Rsve3lZchjA9RU,8180
18
18
  flwr/cli/log.py,sha256=n_fcoECKIkY3MTOfXhB8AjOG1LSQW_GSPY-2qc7rW9Q,6553
19
19
  flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
20
- flwr/cli/login/login.py,sha256=5Fv0VwpyHNUaqNZzcGMkoafpUpzCbXRqL_NUrFbIbzg,4748
20
+ flwr/cli/login/login.py,sha256=TR2whArUBGd6TqS1v4MAKBGLrfABkFdRVQuzKpsUULE,4757
21
21
  flwr/cli/ls.py,sha256=3YK7cpoImJ7PbjlP_JgYRQWz1GymX2q7Reu-mKJEpao,10957
22
22
  flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
23
23
  flwr/cli/new/new.py,sha256=nIuUrQSGDjI4kqnymlq-rOT0RU3AHwZrat3abqHhCwM,10598
@@ -90,7 +90,7 @@ flwr/cli/supernode/__init__.py,sha256=DVrTcyCg9NFll6glPLAAA6WPi7boxu6pFY_PRqIyHM
90
90
  flwr/cli/supernode/create.py,sha256=MloB7Rr-CE_37jH5lFoM8OsaSPUzWt0TSSB_GMwND5E,1959
91
91
  flwr/cli/supernode/delete.py,sha256=_oCfBnoeUFPLEq_1EAqQp_CHEdzIEP2N_vHZsFTgWn0,1958
92
92
  flwr/cli/supernode/ls.py,sha256=j850KQEMpS0rdpL8m9icx7DlRMDRtns6I_iTwUudC_0,1801
93
- flwr/cli/utils.py,sha256=stngRVUJluuSZssHI4XC-jy_z_pVXKVUMmc6JDruhEk,14387
93
+ flwr/cli/utils.py,sha256=3bCu_MndtJD2S5MPG9VKi7SxG0No8S651pcfBVb29Y8,14397
94
94
  flwr/client/__init__.py,sha256=Q0MIF442vLIGSkcwHKq_sIfECQynLARJrumAscq2Q6E,1241
95
95
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
96
96
  flwr/client/dpfedavg_numpy_client.py,sha256=3hul067cT2E9jBhzp7bFnFAZ_D2nWcIUEdHYE05FpzU,7404
@@ -126,7 +126,7 @@ flwr/common/__init__.py,sha256=5GCLVk399Az_rTJHNticRlL0Sl_oPw_j5_LuFKfX7-M,4171
126
126
  flwr/common/address.py,sha256=9JucdTwlc-jpeJkRKeUboZoacUtErwSVtnDR9kAtLqE,4119
127
127
  flwr/common/args.py,sha256=Nq2u4yePbkSY0CWFamn0hZY6Rms8G1xYDeDGIcLIITE,5849
128
128
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
129
- flwr/common/constant.py,sha256=JUKiqlY-yWgsd9PW-ATKW6F0iwMDALxWQOKbZw0vXF8,9177
129
+ flwr/common/constant.py,sha256=c3drkY6oYfQ45fYMYd1bHCgF3XxG7sXmtj8yP6RX4T4,9183
130
130
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
131
131
  flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
132
132
  flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
@@ -171,7 +171,7 @@ flwr/common/secure_aggregation/secaggplus_utils.py,sha256=E_xU-Zd45daO1em7M6C2wO
171
171
  flwr/common/serde.py,sha256=dx66gumR1BpwK45qDwvDLd_05VoKfzkUzWZ7zuZi1-0,21960
172
172
  flwr/common/serde_utils.py,sha256=krx2C_W31KpfmDqnDCtULoTkT8WKweWTJ7FHYWtF1r4,5815
173
173
  flwr/common/telemetry.py,sha256=xfx3KLFQKy0Qx8P7MAsOQxr5J3sEAQF5Kr5J-4jPz-o,8859
174
- flwr/common/typing.py,sha256=o1xw8v2bjG9PwdGjerKsnvepeQQNgWDGHN9clNpAD0g,6951
174
+ flwr/common/typing.py,sha256=MwHVRa1oPzUCbaz32MZKUIeou-4UuNXrMqZnrQzLNoY,6952
175
175
  flwr/common/version.py,sha256=7GAGzPn73Mkh09qhrjbmjZQtcqVhBuzhFBaK4Mk4VRk,1325
176
176
  flwr/compat/__init__.py,sha256=gbfDQKKKMZzi3GswyVRgyLdDlHiWj3wU6dg7y6m5O_s,752
177
177
  flwr/compat/client/__init__.py,sha256=qpbo0lcxdNL4qy5KHqiGm8OLxSxkYgI_-dLh5rwhtcI,746
@@ -191,8 +191,8 @@ flwr/proto/clientappio_pb2.py,sha256=vJjzwWydhg7LruK8cvRAeVQeHPsJztgdIW9nyiPBZF0
191
191
  flwr/proto/clientappio_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
192
192
  flwr/proto/clientappio_pb2_grpc.py,sha256=iobNROP0qvn5zddx7k-uIi_dJWP3T_BRp_kbKq086i8,17550
193
193
  flwr/proto/clientappio_pb2_grpc.pyi,sha256=Ytf1O1ktKB0Vsuc3AWLIErGjIJYokzKYzi2uA7mdMeg,4785
194
- flwr/proto/control_pb2.py,sha256=-0Ltxf1gj_EhmVboj7o-FQWO6RA-mRV_ZRtKuxHoZQA,7741
195
- flwr/proto/control_pb2.pyi,sha256=6npJDwh0VxNrsJPSTVfrko0TexQeLvGUWW2B77jrmjI,13375
194
+ flwr/proto/control_pb2.py,sha256=JR38sRRmlrXbr0QgKXyCZ5WsrwOMut1me_gYtBWU3NM,7742
195
+ flwr/proto/control_pb2.pyi,sha256=nOvDYkVU0WmsVkkfMs-c0rxS2XvQwO7arq0QjDFRyXs,13380
196
196
  flwr/proto/control_pb2_grpc.py,sha256=Of6tnetwnzvJfJWEXhuTFszz4T_IJbdLJD9uRXBdG04,17182
197
197
  flwr/proto/control_pb2_grpc.pyi,sha256=9z_MRrexz0o3_owST8SvhCjQIIAn-SwMWKIihPHzqdM,4801
198
198
  flwr/proto/error_pb2.py,sha256=PQVWrfjVPo88ql_KgV9nCxyQNCcV9PVfmcw7sOzTMro,1084
@@ -249,7 +249,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
249
249
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
250
250
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
251
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
252
- flwr/server/app.py,sha256=lun0ahGP1LhA2XY7g30YIbumeFHiiwEPJoQT1cRqLHU,30278
252
+ flwr/server/app.py,sha256=ESJ55Gl77zptQC10YwZg7WyK8Zr6zisI0rPtQJrx_-w,30698
253
253
  flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
254
254
  flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
255
255
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -406,14 +406,14 @@ flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBI
406
406
  flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gnlg2M2SOqCruji2B0U3ov68NJWKin9scmnWJTiSnNA,1267
407
407
  flwr/superlink/auth_plugin/__init__.py,sha256=ApYBHnDmtv5gVrnxdFq97zC58O1icqHogK2Dz6o8DVI,1000
408
408
  flwr/superlink/auth_plugin/auth_plugin.py,sha256=mKaR2HanhKHmVrcvGqTUv47ut458QgqVU6enU4myB7Y,3038
409
- flwr/superlink/auth_plugin/noop_auth_plugin.py,sha256=esHw8pO0ugfDS8zpfKhnpZdqj4pk3Vnu8p7J-wzNbpY,3040
409
+ flwr/superlink/auth_plugin/noop_auth_plugin.py,sha256=BQ1v1jFZen7AHh6Gwr9arElW3e9aAAKgOO4zKikbd_4,3044
410
410
  flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
411
411
  flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
412
- flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=y0G0O3O0Da3FzZduBC1eK72J4lZocNPeBVMY__r1dL8,6247
412
+ flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=Tbi4WVfWlNsOO-NNbe9iLdYp0thkO5xisi5O8ebzuCs,6252
413
413
  flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=5uBl6VcJlUOgCF0d4kmsmJc1Rs1qxyouaZv0-uH2axs,5969
414
- flwr/superlink/servicer/control/control_grpc.py,sha256=7kEAoK7vh3-ZyutgyZCV8ssj_i-0D6jduzLkAwrU7L8,4264
414
+ flwr/superlink/servicer/control/control_grpc.py,sha256=xajQdX9WuKJmyXZJOaMZKeiSwgSCrile1NOErOiXR5w,4270
415
415
  flwr/superlink/servicer/control/control_license_interceptor.py,sha256=T3AzmRt-PPwyTq3hrdpmZHQd5_CpPOk7TtnFZrB-JRY,3349
416
- flwr/superlink/servicer/control/control_servicer.py,sha256=N5C5vQ2NhghP4OoN0Naa_DN8x-jgjI7EdLhYIvKAyds,17119
416
+ flwr/superlink/servicer/control/control_servicer.py,sha256=KUj45Fu5d6jugLWBkWzPre0l3TqD13NYQCWr-KeiSZ0,17134
417
417
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
418
418
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
419
419
  flwr/supernode/cli/flower_supernode.py,sha256=7aBm0z03OU-npVd1onLCvUotyhSvlZLxAnFkGVMhZcw,8670
@@ -428,7 +428,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
428
428
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
429
429
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
430
430
  flwr/supernode/start_client_internal.py,sha256=Y9S1-QlO2WP6eo4JvWzIpfaCoh2aoE7bjEYyxNNnlyg,20777
431
- flwr_nightly-1.23.0.dev20251002.dist-info/METADATA,sha256=0LElI814cf0s8LtkzqM7gwLl1f1xDlNVusF0emHh89c,14559
432
- flwr_nightly-1.23.0.dev20251002.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
433
- flwr_nightly-1.23.0.dev20251002.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
434
- flwr_nightly-1.23.0.dev20251002.dist-info/RECORD,,
431
+ flwr_nightly-1.23.0.dev20251003.dist-info/METADATA,sha256=7xBlC8J1OJ5gxeh0YlD3fyUQSdf7TTX1KYnrfGh5G9w,14559
432
+ flwr_nightly-1.23.0.dev20251003.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
433
+ flwr_nightly-1.23.0.dev20251003.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
434
+ flwr_nightly-1.23.0.dev20251003.dist-info/RECORD,,