XTLS/Xray-core · error
incomplete profile textures
Error message
incomplete profile textures
What it means
Every profile must carry both TexturesValue and TexturesSignature — the signed skin texture property from the Mojang session server (property 'textures'). Either one missing makes the profile incomplete for login, so profilesFromConfig rejects it at config load.
Source
Thrown at transport/internet/finalmask/xmc/profile.go:26
TexturesValue string
TexturesSignature string
}
func profilesFromConfig(configured []*Profile) ([]loginProfile, error) {
if len(configured) == 0 {
return nil, fmt.Errorf("empty profiles")
}
profiles := make([]loginProfile, 0, len(configured))
for _, configuredProfile := range configured {
if configuredProfile == nil || configuredProfile.Username == "" {
return nil, fmt.Errorf("invalid profile")
}
if len(configuredProfile.Uuid) != len(UUID{}) {
return nil, fmt.Errorf("bad profile UUID length: %d", len(configuredProfile.Uuid))
}
if configuredProfile.TexturesValue == "" || configuredProfile.TexturesSignature == "" {
return nil, fmt.Errorf("incomplete profile textures")
}
profile := loginProfile{
Username: configuredProfile.Username,
TexturesValue: configuredProfile.TexturesValue,
TexturesSignature: configuredProfile.TexturesSignature,
}
copy(profile.UUID[:], configuredProfile.Uuid)
profiles = append(profiles, profile)
}
return profiles, nil
}
func findProfile(profiles []loginProfile, username string, uuid UUID) (loginProfile, bool) {
for _, profile := range profiles {
if profile.Username == username && profile.UUID == uuid {
return profile, true
}View on GitHub (pinned to 7d214f8b09)
Solutions
- Fetch the profile from the Mojang session server while logged in and copy both 'value' and 'signature' of the textures property.
- If the account genuinely has no textures, use an account/skin that does, since this transport requires the signed pair.
- Add a preflight check that both fields are non-empty before generating config.
Example fix
// before
{"username": "steve", "uuid": "...", "texturesValue": "eyJ..."}
// after
{"username": "steve", "uuid": "...", "texturesValue": "eyJ...", "texturesSignature": "MEYCIQD..."} Defensive patterns
Strategy: validation
Validate before calling
if p.TexturesValue == "" || p.TexturesSignature == "" {
return fmt.Errorf("profile %q: textures value and signature are both required", p.Username)
} Prevention
- Copy both 'value' and 'signature' from the Mojang session server's textures property.
- Preflight-check profile completeness before starting the transport.
- Beware secret-redaction tooling blanking the signature field.
When it happens
Trigger: A profile object where texturesValue or texturesSignature is empty: omitted key, blank string, or copied from a session response that had no textures property.
Common situations: Fetching session data from /session/minecraft/profile while the account has no skin uploaded (property list lacks 'textures'); copying only the value half of the property when templating; secrets redaction wiping the signature during config handling.
Related errors
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/bb1bf58e1977f800.
Report an issue: GitHub.