{"record":{"id":"dadeee0677af6f2e","repo":"XTLS/Xray-core","slug":"incomplete-minecraft-profile-textures","errorCode":null,"errorMessage":"incomplete minecraft profile textures","messagePattern":"incomplete minecraft profile textures","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/transport_finalmask.go","lineNumber":750,"sourceCode":"\tUsername          string `json:\"username\"`\n\tUUID              string `json:\"uuid\"`\n\tTexturesValue     string `json:\"texturesValue\"`\n\tTexturesSignature string `json:\"texturesSignature\"`\n}\n\nvar xmcUsernamePattern = regexp.MustCompile(`^[A-Za-z0-9_]{3,16}$`)\n\nfunc (c *XMCProfile) Build() (*xmc.Profile, error) {\n\tif !xmcUsernamePattern.MatchString(c.Username) {\n\t\treturn nil, fmt.Errorf(\"invalid minecraft profile username: %q\", c.Username)\n\t}\n\n\tprofileUUID, err := googleuuid.Parse(c.UUID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid minecraft profile UUID: %w\", err)\n\t}\n\tif c.TexturesValue == \"\" || c.TexturesSignature == \"\" {\n\t\treturn nil, fmt.Errorf(\"incomplete minecraft profile textures\")\n\t}\n\n\treturn &xmc.Profile{\n\t\tUsername:          c.Username,\n\t\tUuid:              append([]byte(nil), profileUUID[:]...),\n\t\tTexturesValue:     c.TexturesValue,\n\t\tTexturesSignature: c.TexturesSignature,\n\t}, nil\n}\n\nfunc (c *XMC) Build() (proto.Message, error) {\n\tif len(c.Profiles) == 0 {\n\t\treturn nil, fmt.Errorf(\"minecraft profiles are required\")\n\t}\n\n\tif c.Password == \"\" {\n\t\treturn nil, fmt.Errorf(\"empty password\")\n\t}","sourceCodeStart":732,"sourceCodeEnd":768,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/transport_finalmask.go#L732-L768","documentation":"XMCProfile.Build requires both TexturesValue and TexturesSignature to be non-empty, because the XMC transport must present a signed Minecraft skin texture payload. This error fires when either half of the signed texture pair is missing.","triggerScenarios":"Configuring an xmc profile with only \"texturesValue\" or only \"texturesSignature\", or with one of them set to an empty string.","commonSituations":"Fetching textures from sessionserver.mojang.com and copying only the \"value\" field of the textures property while skipping \"signature\"; assuming signature is optional; JSON key typos (texturesSignature vs textureSignature) silently leaving the field empty.","solutions":["Copy BOTH \"value\" and \"signature\" from the signed profile response (sessionserver with unsigned=false)","Match the JSON keys exactly: texturesValue and texturesSignature","Re-fetch the profile if the signature came back empty"],"exampleFix":"// before\n\"texturesValue\": \"ewogICJ0ZXh0dXJlcyIgOiB7...\"\n// signature missing\n\n// after\n\"texturesValue\": \"ewogICJ0ZXh0dXJlcyIgOiB7...\",\n\"texturesSignature\": \"K8vLbP...longBase64...=\"","handlingStrategy":"validation","validationCode":"func profileComplete(p XMCProfile) bool {\n    return p.TexturesValue != \"\" && p.TexturesSignature != \"\"\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always copy value AND signature together from the signed textures property","Fetch profiles with unsigned=false","Reject half-filled profiles in your config generator"],"tags":["xmc","minecraft","textures","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}