Skip to content

Simplifies the format for client IDs. #2072

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 11, 2025
Merged

Simplifies the format for client IDs. #2072

merged 3 commits into from
Apr 11, 2025

Conversation

lrhn
Copy link
Member

@lrhn lrhn commented Apr 10, 2025

The existing code created a 128-bit UUIDv4 from a Random object with ~32 bits of entropy.
The server and protocol don't care about the format, almost any string is valid and accepted.

This implementation creates a simple 6-character string encoding a 32-bit random number,
which doesn't look like it has more entropy than it does.
(If more entropy is desired, the code should start using a real UUID generator or a better
random source.)

Fixes #2071.

The existing code created a 128-bit UUIDv4 from a
`Random` object with ~32 bits of entropy.
The server and protocol doesn't actually care about
the format.
This implementation creates a simple 6-character string
encoding a 32-bit random number, which doesn't look
like it has more entropy than it does.
@lrhn lrhn requested a review from a team as a code owner April 10, 2025 14:14
Copy link

github-actions bot commented Apr 10, 2025

PR Health

Breaking changes ✔️
Package Change Current Version New Version Needed Version Looking good?
sse None 4.1.7 4.1.8 4.1.7 ✔️
Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

Coverage ⚠️
File Coverage
pkgs/sse/lib/client/sse_client.dart 💔 Not covered
pkgs/sse/lib/src/util/id.dart 💔 Not covered

This check for test coverage is informational (issues shown here will not fail the PR).

This check can be disabled by tagging the PR with skip-coverage-check.

API leaks ✔️

The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.

Package Leaked API symbols
License Headers ✔️
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
Files
no missing headers

All source files should start with a license header.

Unrelated files missing license headers
Files
pkgs/bazel_worker/benchmark/benchmark.dart
pkgs/bazel_worker/example/client.dart
pkgs/bazel_worker/example/worker.dart
pkgs/benchmark_harness/integration_test/perf_benchmark_test.dart
pkgs/boolean_selector/example/example.dart
pkgs/clock/lib/clock.dart
pkgs/clock/lib/src/clock.dart
pkgs/clock/lib/src/default.dart
pkgs/clock/lib/src/stopwatch.dart
pkgs/clock/lib/src/utils.dart
pkgs/clock/test/clock_test.dart
pkgs/clock/test/default_test.dart
pkgs/clock/test/stopwatch_test.dart
pkgs/clock/test/utils.dart
pkgs/coverage/lib/src/coverage_options.dart
pkgs/coverage/test/collect_coverage_config_test.dart
pkgs/coverage/test/config_file_locator_test.dart
pkgs/html/example/main.dart
pkgs/html/lib/dom.dart
pkgs/html/lib/dom_parsing.dart
pkgs/html/lib/html_escape.dart
pkgs/html/lib/parser.dart
pkgs/html/lib/src/constants.dart
pkgs/html/lib/src/encoding_parser.dart
pkgs/html/lib/src/html_input_stream.dart
pkgs/html/lib/src/list_proxy.dart
pkgs/html/lib/src/query_selector.dart
pkgs/html/lib/src/token.dart
pkgs/html/lib/src/tokenizer.dart
pkgs/html/lib/src/treebuilder.dart
pkgs/html/lib/src/utils.dart
pkgs/html/test/dom_test.dart
pkgs/html/test/parser_feature_test.dart
pkgs/html/test/parser_test.dart
pkgs/html/test/query_selector_test.dart
pkgs/html/test/selectors/level1_baseline_test.dart
pkgs/html/test/selectors/level1_lib.dart
pkgs/html/test/selectors/selectors.dart
pkgs/html/test/support.dart
pkgs/html/test/tokenizer_test.dart
pkgs/pubspec_parse/test/git_uri_test.dart
pkgs/stack_trace/example/example.dart
pkgs/watcher/test/custom_watcher_factory_test.dart
pkgs/yaml_edit/example/example.dart

Copy link

Package publishing

Package Version Status Publish tag (post-merge)
package:bazel_worker 1.1.3 already published at pub.dev
package:benchmark_harness 2.3.1 already published at pub.dev
package:boolean_selector 2.1.2 already published at pub.dev
package:browser_launcher 1.1.3 already published at pub.dev
package:cli_config 0.2.1-wip WIP (no publish necessary)
package:cli_util 0.4.2 already published at pub.dev
package:clock 1.1.2 already published at pub.dev
package:code_builder 4.10.1 already published at pub.dev
package:coverage 1.12.0 already published at pub.dev
package:csslib 1.0.2 already published at pub.dev
package:extension_discovery 2.1.0 already published at pub.dev
package:file 7.0.2-wip WIP (no publish necessary)
package:file_testing 3.1.0-wip WIP (no publish necessary)
package:glob 2.1.3 already published at pub.dev
package:graphs 2.3.3-wip WIP (no publish necessary)
package:html 0.15.5+1 already published at pub.dev
package:io 1.1.0-wip WIP (no publish necessary)
package:json_rpc_2 3.0.3 already published at pub.dev
package:markdown 7.3.1-wip WIP (no publish necessary)
package:mime 2.0.0 already published at pub.dev
package:oauth2 2.0.4-wip WIP (no publish necessary)
package:package_config 2.3.0-wip WIP (no publish necessary)
package:pool 1.5.2-wip WIP (no publish necessary)
package:pub_semver 2.2.0 already published at pub.dev
package:pubspec_parse 1.5.0 already published at pub.dev
package:source_map_stack_trace 2.1.3-wip WIP (no publish necessary)
package:source_maps 0.10.14-wip WIP (no publish necessary)
package:source_span 1.10.1 already published at pub.dev
package:sse 4.1.8 ready to publish sse-v4.1.8
package:stack_trace 1.12.1 already published at pub.dev
package:stream_channel 2.1.4 already published at pub.dev
package:stream_transform 2.1.2-wip WIP (no publish necessary)
package:string_scanner 1.4.1 already published at pub.dev
package:term_glyph 1.2.3-wip WIP (no publish necessary)
package:test_reflective_loader 0.2.3 already published at pub.dev
package:timing 1.0.2 already published at pub.dev
package:unified_analytics 8.0.1 ready to publish unified_analytics-v8.0.1
package:watcher 1.1.1 already published at pub.dev
package:yaml 3.1.3 already published at pub.dev
package:yaml_edit 2.2.2 already published at pub.dev

Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.

Copy link
Contributor

@bkonyi bkonyi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM overall.

/// Generates a pseudo-random ID string with 32 bits of entropy.
String generateId() {
final chars = List<int>.filled(6, 0);
final random = Random();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would there be any benefit if we used Random.secure() instead? I'm guessing no, since this isn't actually being used as a secret.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depends on why an ID is being generated to begin with.

If the goal is just to avoid ID collisions, then it depends on how many simultaneous clients a server will have. Too many, and a 32-bit PRNG generated ID might be insufficient to (statistically) avoid two with the same ID.
Then more randomness is enough, it doesn't have to be secure.

If the goal is to prevent someone deliberately forging the same ID as another client, then being secure might be more important than being more random. Brute force might still not be viable.

Update copyright year.
@lrhn lrhn merged commit 2bb6eba into main Apr 11, 2025
14 checks passed
@lrhn lrhn deleted the sse-uid branch April 11, 2025 10:32
copybara-service bot pushed a commit to dart-lang/sdk that referenced this pull request Apr 16, 2025
Revisions updated by `dart tools/rev_sdk_deps.dart`.

ecosystem (https://github.com/dart-lang/ecosystem/compare/7f6f1c1..815d4ba):
  815d4ba  2025-04-15  Devon Carew  [firehose] don't fail publish validation if we see the pub pre-release warning (dart-lang/ecosystem#357)
  e7bae16  2025-04-15  Moritz  Fix label fetching (dart-lang/ecosystem#358)
  7aa1313  2025-04-15  Moritz  Fix PR label fetching (dart-lang/ecosystem#356)

test (https://github.com/dart-lang/test/compare/8643fbf..84eba11):
  84eba115  2025-04-11  Daco Harkes  [native assets] Add support for pub workspaces (dart-lang/test#2484)
  ab850972  2025-04-11  Daco Harkes  [native assets] Add support for pub workspaces
  9f9fd77d  2025-04-10  Nate Bosch  Migrate host.dart to new JS interop (dart-lang/test#2448)

tools (https://github.com/dart-lang/tools/compare/d74f9e1..4a28415):
  4a284152  2025-04-15  Moritz  [package:code_builder] Remove transitive dependency on package:macros (dart-lang/tools#2073)
  2bb6eba7  2025-04-11  Lasse R.H. Nielsen  Simplifies the format for client IDs. (dart-lang/tools#2072)
  77e41774  2025-04-10  Liam Appelbe  [coverage] Prepare to publish (dart-lang/tools#2070)
  e7168ae1  2025-04-10  Liam Appelbe  [coverage] Finish collection as soon as main isolate exits (dart-lang/tools#2069)

vector_math (https://github.com/google/vector_math.dart/compare/f08d7d2..dc9d379):
  dc9d379  2025-04-15  Lukas Klingsbo  chore: Remove test_all.dart since this is built-in to `dart test` (google/vector_math.dart#343)

webdev (https://github.com/dart-lang/webdev/compare/c8b1cfa..5bf833d):
  5bf833d0  2025-04-15  Srujan Gaddam  Support hot reload testing (dart-lang/webdev#2611)
  fa0b74bf  2025-04-14  Srujan Gaddam  Add support for hot restart tests in DWDS with the frontend server (dart-lang/webdev#2608)

Change-Id: Ic3ff6ed88ee2db935dc48fafe1e16a869d73506c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422580
Reviewed-by: Ivan Inozemtsev <iinozemtsev@google.com>
Commit-Queue: Ivan Inozemtsev <iinozemtsev@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

SSE package has its own UUID generator.
2 participants