mirror of
https://github.com/juanfont/headscale.git
synced 2026-01-12 04:10:32 +01:00
[Bug] Normalization of hostnames #1166
Open
opened 2025-12-29 02:28:41 +01:00 by adam
·
4 comments
No Branch/Tag Specified
main
update_flake_lock_action
gh-pages
kradalby/release-v0.27.2
dependabot/go_modules/golang.org/x/crypto-0.45.0
dependabot/go_modules/github.com/opencontainers/runc-1.3.3
copilot/investigate-headscale-issue-2788
copilot/investigate-visibility-issue-2788
copilot/investigate-issue-2833
copilot/debug-issue-2846
copilot/fix-issue-2847
dependabot/go_modules/github.com/go-viper/mapstructure/v2-2.4.0
dependabot/go_modules/github.com/docker/docker-28.3.3incompatible
kradalby/cli-experiement3
doc/0.26.1
doc/0.25.1
doc/0.25.0
doc/0.24.3
doc/0.24.2
doc/0.24.1
doc/0.24.0
kradalby/build-docker-on-pr
topic/docu-versioning
topic/docker-kos
juanfont/fix-crash-node-id
juanfont/better-disclaimer
update-contributors
topic/prettier
revert-1893-add-test-stage-to-docs
add-test-stage-to-docs
remove-node-check-interval
fix-empty-prefix
fix-ephemeral-reusable
bug_report-debuginfo
autogroups
logs-to-stderr
revert-1414-topic/fix_unix_socket
rename-machine-node
port-embedded-derp-tests-v2
port-derp-tests
duplicate-word-linter
update-tailscale-1.36
warn-against-apache
ko-fi-link
more-acl-tests
fix-typo-standalone
parallel-nolint
tparallel-fix
rerouting
ssh-changelog-docs
oidc-cleanup
web-auth-flow-tests
kradalby-gh-runner
fix-proto-lint
remove-funding-links
go-1.19
enable-1.30-in-tests
0.16.x
cosmetic-changes-integration
tmp-fix-integration-docker
fix-integration-docker
configurable-update-interval
show-nodes-online
hs2021
acl-syntax-fixes
ts2021-implementation
fix-spurious-updates
unstable-integration-tests
mandatory-stun
embedded-derp
prtemplate-fix
v0.28.0-beta.1
v0.27.2-rc.1
v0.27.1
v0.27.0
v0.27.0-beta.2
v0.27.0-beta.1
v0.26.1
v0.26.0
v0.26.0-beta.2
v0.26.0-beta.1
v0.25.1
v0.25.0
v0.25.0-beta.2
v0.24.3
v0.25.0-beta.1
v0.24.2
v0.24.1
v0.24.0
v0.24.0-beta.2
v0.24.0-beta.1
v0.23.0
v0.23.0-rc.1
v0.23.0-beta.5
v0.23.0-beta.4
v0.23.0-beta3
v0.23.0-beta2
v0.23.0-beta1
v0.23.0-alpha12
v0.23.0-alpha11
v0.23.0-alpha10
v0.23.0-alpha9
v0.23.0-alpha8
v0.23.0-alpha7
v0.23.0-alpha6
v0.23.0-alpha5
v0.23.0-alpha4
v0.23.0-alpha4-docker-ko-test9
v0.23.0-alpha4-docker-ko-test8
v0.23.0-alpha4-docker-ko-test7
v0.23.0-alpha4-docker-ko-test6
v0.23.0-alpha4-docker-ko-test5
v0.23.0-alpha-docker-release-test-debug2
v0.23.0-alpha-docker-release-test-debug
v0.23.0-alpha4-docker-ko-test4
v0.23.0-alpha4-docker-ko-test3
v0.23.0-alpha4-docker-ko-test2
v0.23.0-alpha4-docker-ko-test
v0.23.0-alpha3
v0.23.0-alpha2
v0.23.0-alpha1
v0.22.3
v0.22.2
v0.23.0-alpha-docker-release-test
v0.22.1
v0.22.0
v0.22.0-alpha3
v0.22.0-alpha2
v0.22.0-alpha1
v0.22.0-nfpmtest
v0.21.0
v0.20.0
v0.19.0
v0.19.0-beta2
v0.19.0-beta1
v0.18.0
v0.18.0-beta4
v0.18.0-beta3
v0.18.0-beta2
v0.18.0-beta1
v0.17.1
v0.17.0
v0.17.0-beta5
v0.17.0-beta4
v0.17.0-beta3
v0.17.0-beta2
v0.17.0-beta1
v0.17.0-alpha4
v0.17.0-alpha3
v0.17.0-alpha2
v0.17.0-alpha1
v0.16.4
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.16.0-beta7
v0.16.0-beta6
v0.16.0-beta5
v0.16.0-beta4
v0.16.0-beta3
v0.16.0-beta2
v0.16.0-beta1
v0.15.0
v0.15.0-beta6
v0.15.0-beta5
v0.15.0-beta4
v0.15.0-beta3
v0.15.0-beta2
v0.15.0-beta1
v0.14.0
v0.14.0-beta2
v0.14.0-beta1
v0.13.0
v0.13.0-beta3
v0.13.0-beta2
v0.13.0-beta1
upstream/v0.12.4
v0.12.4
v0.12.3
v0.12.2
v0.12.2-beta1
v0.12.1
v0.12.0-beta2
v0.12.0-beta1
v0.11.0
v0.10.8
v0.10.7
v0.10.6
v0.10.5
v0.10.4
v0.10.3
v0.10.2
v0.10.1
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.1
v0.8.0
v0.7.1
v0.7.0
v0.6.1
v0.6.0
v0.5.2
v0.5.1
v0.5.0
v0.4.0
v0.3.6
v0.3.5
v0.3.4
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.2
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
Clear labels
CLI
DERP
DNS
Nix
OIDC
SSH
bug
database
documentation
duplicate
enhancement
faq
good first issue
grants
help wanted
might-come
needs design doc
needs investigation
no-stale-bot
out of scope
performance
policy 📝
pull-request
question
regression
routes
stale
tags
tailscale-feature-gap
well described ❤️
wontfix
Mirrored from GitHub Pull Request
No Label
bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/headscale#1166
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @griffer on GitHub (Dec 1, 2025).
Is this a support request?
Is there an existing issue for this?
Current Behavior
First off, love Headscale, it works great!
I think I found a bug in hostname handling.
When a client reports a hostname like "My-PC!", it fails ValidateHostname() and gets replaced with "invalid-xyz". Headscales code has a NormaliseHostname() function that would sanitize this to "my-pc".
The affected code paths are:
Both use ValidateHostname() (reject if invalid), instead of NormaliseHostname() (sanitize and accept).
This seems like an oversight? The NormaliseHostname function exists but isn't being used.
Expected Behavior
Expected: Hostname "My-PC!" → sanitized to "my-pc"
Actual: Hostname "My-PC!" → rejected, becomes "invalid-abc123"
Steps To Reproduce
On client with hostname "My-PC!"
tailscale up --login-server https://your-headscale-server
List nodes on server:
headscale nodes list
Expected: Node appears as my-pc
Actual: Node appears as invalid-abc123
Environment
Runtime environment
Debug information
This is a code logic issue, so dont believe debug log is useful.
@roganlynch commented on GitHub (Dec 13, 2025):
I believe that this is the "as designed" behavior your are observing. The Changelog indicates that the first function downcases improperly cased strings while the second synthesizes a DNS compatible string when a string contains an illegal character (outside of dns hostname spec)
More rigorous hostname formulation might be desirable, but that's really more the client's prerogative - the client needs to self-identify as something dns-flavored - not "I'm a Pretty Mac!" or some other nonsense. The invalid-1a2b3c garbage is intentionally painful - so as to drive home that point. If you want it to work, then do so, one.host.at.a.time.
@aalmenar commented on GitHub (Dec 13, 2025):
@roganlynch this behaviour it's not like the upstream tailscale service. Also, not in all case you have the possibility to fix every host in the tailnet, if you have users (Like i have at home) each one will login to headscale using my oidc but im not gonna be following each of them to fix the hostname to be DNS compatible.
I have a user who as "My pretty macbook", i don't expect hostname to be "invalid-1a2b3c" but "my-pretty-macbook", from there if i want to rename it, also breaks the nicety of using magicdns. i dont expect to be perfect conversion, but close enough to the original name, i dont expect emojis and international characters or any idna conversion but something like white spaces can be converted to dashes.
@griffer commented on GitHub (Dec 15, 2025):
@roganlynch This may be intentional behavior. My observation was primarily about internal consistency in the codebase rather than client responsibility.
There is already a NormaliseHostname() function that produces a DNS-compatible hostname by sanitizing invalid characters (e.g., "My-PC!" => "my-pc"). However, the current logic paths (ApplyHostnameFromHostInfo() and EnsureHostname()) reject such hostnames via ValidateHostname() instead of applying normalization.
In my local setup, I tested a minimal change that applies NormaliseHostname() prior to validation. With that adjustment, hostnames containing minor invalid characters are consistently normalized and no longer replaced with invalid-*, without adding new behavior beyond what already exists.
I raised this mainly to clarify whether the existing normalization function is intentionally unused in these paths or whether its absence is incidental.
@roganlynch commented on GitHub (Dec 16, 2025):
Thank you for the clarification. Sounds like you could/should just submit a
PR with your commit if you done some amount of validation, link the issue
with the PR and let the maintainers decide.
Would seem like a no-brainer.
On Mon, Dec 15, 2025 at 12:32 AM griffer @.***> wrote:
--
tel: (408) 426-8649