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

  1. Fetch the profile from the Mojang session server while logged in and copy both 'value' and 'signature' of the textures property.
  2. If the account genuinely has no textures, use an account/skin that does, since this transport requires the signed pair.
  3. 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

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.