{"record":{"id":"bb1bf58e1977f800","repo":"XTLS/Xray-core","slug":"incomplete-profile-textures","errorCode":null,"errorMessage":"incomplete profile textures","messagePattern":"incomplete profile textures","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"transport/internet/finalmask/xmc/profile.go","lineNumber":26,"sourceCode":"\tTexturesValue     string\n\tTexturesSignature string\n}\n\nfunc profilesFromConfig(configured []*Profile) ([]loginProfile, error) {\n\tif len(configured) == 0 {\n\t\treturn nil, fmt.Errorf(\"empty profiles\")\n\t}\n\n\tprofiles := make([]loginProfile, 0, len(configured))\n\tfor _, configuredProfile := range configured {\n\t\tif configuredProfile == nil || configuredProfile.Username == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"invalid profile\")\n\t\t}\n\t\tif len(configuredProfile.Uuid) != len(UUID{}) {\n\t\t\treturn nil, fmt.Errorf(\"bad profile UUID length: %d\", len(configuredProfile.Uuid))\n\t\t}\n\t\tif configuredProfile.TexturesValue == \"\" || configuredProfile.TexturesSignature == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"incomplete profile textures\")\n\t\t}\n\n\t\tprofile := loginProfile{\n\t\t\tUsername:          configuredProfile.Username,\n\t\t\tTexturesValue:     configuredProfile.TexturesValue,\n\t\t\tTexturesSignature: configuredProfile.TexturesSignature,\n\t\t}\n\t\tcopy(profile.UUID[:], configuredProfile.Uuid)\n\t\tprofiles = append(profiles, profile)\n\t}\n\treturn profiles, nil\n}\n\nfunc findProfile(profiles []loginProfile, username string, uuid UUID) (loginProfile, bool) {\n\tfor _, profile := range profiles {\n\t\tif profile.Username == username && profile.UUID == uuid {\n\t\t\treturn profile, true\n\t\t}","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/transport/internet/finalmask/xmc/profile.go#L8-L44","documentation":"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.","triggerScenarios":"A profile object where texturesValue or texturesSignature is empty: omitted key, blank string, or copied from a session response that had no textures property.","commonSituations":"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.","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."],"exampleFix":"// before\n{\"username\": \"steve\", \"uuid\": \"...\", \"texturesValue\": \"eyJ...\"}\n// after\n{\"username\": \"steve\", \"uuid\": \"...\", \"texturesValue\": \"eyJ...\", \"texturesSignature\": \"MEYCIQD...\"}","handlingStrategy":"validation","validationCode":"if p.TexturesValue == \"\" || p.TexturesSignature == \"\" {\n    return fmt.Errorf(\"profile %q: textures value and signature are both required\", p.Username)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["go","configuration","minecraft","authentication","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}