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.
- flwr/cli/auth_plugin/__init__.py +2 -2
- flwr/cli/auth_plugin/oidc_cli_plugin.py +3 -3
- flwr/cli/login/login.py +5 -5
- flwr/cli/utils.py +9 -9
- flwr/common/constant.py +4 -4
- flwr/common/typing.py +1 -1
- flwr/proto/control_pb2.py +28 -28
- flwr/proto/control_pb2.pyi +4 -4
- flwr/server/app.py +18 -7
- flwr/superlink/auth_plugin/noop_auth_plugin.py +2 -2
- flwr/superlink/servicer/control/control_account_auth_interceptor.py +4 -4
- flwr/superlink/servicer/control/control_grpc.py +5 -5
- flwr/superlink/servicer/control/control_servicer.py +13 -13
- {flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/METADATA +1 -1
- {flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/RECORD +17 -17
- {flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/entry_points.txt +0 -0
flwr/cli/auth_plugin/__init__.py
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
"""Flower account auth plugins."""
|
16
16
|
|
17
17
|
|
18
|
-
from flwr.common.constant import
|
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 {
|
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
|
-
|
28
|
+
AUTHN_TYPE_JSON_KEY,
|
29
29
|
REFRESH_TOKEN_KEY,
|
30
|
-
|
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
|
-
|
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-
|
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
|
-
|
106
|
+
authn_type = login_response.authn_type
|
107
107
|
auth_plugin = try_obtain_cli_auth_plugin(
|
108
|
-
app, federation, federation_config,
|
108
|
+
app, federation, federation_config, authn_type
|
109
109
|
)
|
110
110
|
if auth_plugin is None:
|
111
111
|
typer.secho(
|
112
|
-
f'❌ Authentication type "{
|
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
|
-
|
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
|
-
|
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
|
-
|
237
|
+
authn_type: Optional[str] = None,
|
238
238
|
) -> Optional[CliAuthPlugin]:
|
239
|
-
"""Load the CLI-side account auth plugin for the given
|
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
|
247
|
-
#
|
248
|
-
if
|
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
|
-
|
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[
|
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: {
|
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
|
-
|
115
|
-
|
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
|
248
|
+
class AuthnType:
|
249
249
|
"""Account authentication types."""
|
250
250
|
|
251
251
|
NOOP = "noop"
|
252
252
|
OIDC = "oidc"
|
253
253
|
|
254
|
-
def __new__(cls) ->
|
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
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\"\
|
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=
|
53
|
-
_globals['_GETAUTHTOKENSREQUEST']._serialized_start=
|
54
|
-
_globals['_GETAUTHTOKENSREQUEST']._serialized_end=
|
55
|
-
_globals['_GETAUTHTOKENSRESPONSE']._serialized_start=
|
56
|
-
_globals['_GETAUTHTOKENSRESPONSE']._serialized_end=
|
57
|
-
_globals['_STOPRUNREQUEST']._serialized_start=
|
58
|
-
_globals['_STOPRUNREQUEST']._serialized_end=
|
59
|
-
_globals['_STOPRUNRESPONSE']._serialized_start=
|
60
|
-
_globals['_STOPRUNRESPONSE']._serialized_end=
|
61
|
-
_globals['_PULLARTIFACTSREQUEST']._serialized_start=
|
62
|
-
_globals['_PULLARTIFACTSREQUEST']._serialized_end=
|
63
|
-
_globals['_PULLARTIFACTSRESPONSE']._serialized_start=
|
64
|
-
_globals['_PULLARTIFACTSRESPONSE']._serialized_end=
|
65
|
-
_globals['_CREATENODECLIREQUEST']._serialized_start=
|
66
|
-
_globals['_CREATENODECLIREQUEST']._serialized_end=
|
67
|
-
_globals['_CREATENODECLIRESPONSE']._serialized_start=
|
68
|
-
_globals['_CREATENODECLIRESPONSE']._serialized_end=
|
69
|
-
_globals['_DELETENODECLIREQUEST']._serialized_start=
|
70
|
-
_globals['_DELETENODECLIREQUEST']._serialized_end=
|
71
|
-
_globals['_DELETENODECLIRESPONSE']._serialized_start=
|
72
|
-
_globals['_DELETENODECLIRESPONSE']._serialized_end=
|
73
|
-
_globals['_LISTNODESCLIREQUEST']._serialized_start=
|
74
|
-
_globals['_LISTNODESCLIREQUEST']._serialized_end=
|
75
|
-
_globals['_LISTNODESCLIRESPONSE']._serialized_start=
|
76
|
-
_globals['_LISTNODESCLIRESPONSE']._serialized_end=
|
77
|
-
_globals['_CONTROL']._serialized_start=
|
78
|
-
_globals['_CONTROL']._serialized_end=
|
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)
|
flwr/proto/control_pb2.pyi
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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["
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
493
|
+
authn_plugin = _load_plugin(
|
483
494
|
section="authentication",
|
484
|
-
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
|
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,
|
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
|
-
|
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
|
-
|
58
|
+
authn_plugin: ControlAuthnPlugin,
|
59
59
|
authz_plugin: ControlAuthzPlugin,
|
60
60
|
):
|
61
|
-
self.
|
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.
|
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.
|
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
|
-
|
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
|
-
|
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
|
79
|
-
interceptors.append(ControlAccountAuthInterceptor(
|
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
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
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.
|
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.
|
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.
|
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
|
|
{flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.23.0.
|
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
|
{flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/RECORD
RENAMED
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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
|
195
|
-
flwr/proto/control_pb2.pyi,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
432
|
-
flwr_nightly-1.23.0.
|
433
|
-
flwr_nightly-1.23.0.
|
434
|
-
flwr_nightly-1.23.0.
|
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,,
|
{flwr_nightly-1.23.0.dev20251002.dist-info → flwr_nightly-1.23.0.dev20251003.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|