mirror of
				https://github.com/elyby/chrly.git
				synced 2025-05-31 14:11:51 +05:30 
			
		
		
		
	Added onUnknownProfileRespondWithUuid param to the /profile endpoint
				
					
				
			Introducing profiles endpoint was a mistake, but we had to deal with that mistake until I'll remove it. The Accounts service needs textures with a signature. But it is possible that a user has a fresh account and Chrly has not yet received the profile information. In this case we have no way to get textures for the player. Adding the onUnknownProfileRespondWithUuid parameter solves this problem. This is a bad solution and nobody should use it except Ely.by infrastructure. In v5 version the texture signature on Chrly will be removed.
This commit is contained in:
		| @@ -190,8 +190,15 @@ func (ctx *Skinsystem) profileHandler(response http.ResponseWriter, request *htt | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if profile == nil { | 	if profile == nil { | ||||||
| 		response.WriteHeader(http.StatusNoContent) | 		forceResponseWithUuid := request.URL.Query().Get("onUnknownProfileRespondWithUuid") | ||||||
| 		return | 		if forceResponseWithUuid == "" { | ||||||
|  | 			response.WriteHeader(http.StatusNoContent) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		profile = createEmptyProfile() | ||||||
|  | 		profile.Id = formatUuid(forceResponseWithUuid) | ||||||
|  | 		profile.Username = parseUsername(mux.Vars(request)["username"]) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	texturesPropContent := &mojang.TexturesProp{ | 	texturesPropContent := &mojang.TexturesProp{ | ||||||
| @@ -274,12 +281,10 @@ func (ctx *Skinsystem) getProfile(request *http.Request, proxy bool) (*profile, | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	profile := &profile{ | 	profile := createEmptyProfile() | ||||||
| 		Textures: &mojang.TexturesResponse{}, // Field must be initialized to avoid "null" after json encoding |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if skin != nil { | 	if skin != nil { | ||||||
| 		profile.Id = strings.Replace(skin.Uuid, "-", "", -1) | 		profile.Id = formatUuid(skin.Uuid) | ||||||
| 		profile.Username = skin.Username | 		profile.Username = skin.Username | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -354,6 +359,16 @@ func (ctx *Skinsystem) getProfile(request *http.Request, proxy bool) (*profile, | |||||||
| 	return profile, nil | 	return profile, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func createEmptyProfile() *profile { | ||||||
|  | 	return &profile{ | ||||||
|  | 		Textures: &mojang.TexturesResponse{}, // Field must be initialized to avoid "null" after json encoding | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func formatUuid(uuid string) string { | ||||||
|  | 	return strings.Replace(uuid, "-", "", -1) | ||||||
|  | } | ||||||
|  |  | ||||||
| func parseUsername(username string) string { | func parseUsername(username string) string { | ||||||
| 	return strings.TrimSuffix(username, ".png") | 	return strings.TrimSuffix(username, ".png") | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import ( | |||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/http/httptest" | 	"net/http/httptest" | ||||||
|  | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -742,11 +743,12 @@ func (suite *skinsystemTestSuite) TestSignedTextures() { | |||||||
|  ***************************/ |  ***************************/ | ||||||
|  |  | ||||||
| type profileTestCase struct { | type profileTestCase struct { | ||||||
| 	Name       string | 	Name          string | ||||||
| 	Signed     bool | 	Signed        bool | ||||||
| 	BeforeTest func(suite *skinsystemTestSuite) | 	ForceResponse string | ||||||
| 	PanicErr   string | 	BeforeTest    func(suite *skinsystemTestSuite) | ||||||
| 	AfterTest  func(suite *skinsystemTestSuite, response *http.Response) | 	PanicErr      string | ||||||
|  | 	AfterTest     func(suite *skinsystemTestSuite, response *http.Response) | ||||||
| } | } | ||||||
|  |  | ||||||
| var profileTestsCases = []*profileTestCase{ | var profileTestsCases = []*profileTestCase{ | ||||||
| @@ -1028,6 +1030,36 @@ var profileTestsCases = []*profileTestCase{ | |||||||
| 			suite.Equal("", string(body)) | 			suite.Equal("", string(body)) | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		Name:          "Username not exists and Mojang profile unavailable, but there is a forceResponse param", | ||||||
|  | 		ForceResponse: "a12e41a4-e8e5-4503-987e-0adacf72ab93", | ||||||
|  | 		Signed:        true, | ||||||
|  | 		BeforeTest: func(suite *skinsystemTestSuite) { | ||||||
|  | 			suite.SkinsRepository.On("FindSkinByUsername", "mock_username").Return(nil, nil) | ||||||
|  | 			suite.MojangTexturesProvider.On("GetForUsername", "mock_username").Once().Return(nil, nil) | ||||||
|  | 			suite.TexturesSigner.On("SignTextures", mock.Anything).Return("chrly signature", nil) | ||||||
|  | 		}, | ||||||
|  | 		AfterTest: func(suite *skinsystemTestSuite, response *http.Response) { | ||||||
|  | 			suite.Equal(200, response.StatusCode) | ||||||
|  | 			suite.Equal("application/json", response.Header.Get("Content-Type")) | ||||||
|  | 			body, _ := ioutil.ReadAll(response.Body) | ||||||
|  | 			suite.JSONEq(`{ | ||||||
|  | 				"id": "a12e41a4e8e54503987e0adacf72ab93", | ||||||
|  | 				"name": "mock_username", | ||||||
|  | 				"properties": [ | ||||||
|  | 					{ | ||||||
|  | 						"name": "textures", | ||||||
|  | 						"signature": "chrly signature", | ||||||
|  | 						"value": "eyJ0aW1lc3RhbXAiOjE2MTQyMTQyMjMwMDAsInByb2ZpbGVJZCI6ImExMmU0MWE0ZThlNTQ1MDM5ODdlMGFkYWNmNzJhYjkzIiwicHJvZmlsZU5hbWUiOiJtb2NrX3VzZXJuYW1lIiwidGV4dHVyZXMiOnt9fQ==" | ||||||
|  | 					}, | ||||||
|  | 					{ | ||||||
|  | 						"name": "texturesParamName", | ||||||
|  | 						"value": "texturesParamValue" | ||||||
|  | 					} | ||||||
|  | 				] | ||||||
|  | 			}`, string(body)) | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		Name: "Username not exists and Mojang textures proxy returned an error", | 		Name: "Username not exists and Mojang textures proxy returned an error", | ||||||
| 		BeforeTest: func(suite *skinsystemTestSuite) { | 		BeforeTest: func(suite *skinsystemTestSuite) { | ||||||
| @@ -1060,12 +1092,18 @@ func (suite *skinsystemTestSuite) TestProfile() { | |||||||
| 		suite.RunSubTest(testCase.Name, func() { | 		suite.RunSubTest(testCase.Name, func() { | ||||||
| 			testCase.BeforeTest(suite) | 			testCase.BeforeTest(suite) | ||||||
|  |  | ||||||
| 			url := "http://chrly/profile/mock_username" | 			u, _ := url.Parse("http://chrly/profile/mock_username") | ||||||
|  | 			q := make(url.Values) | ||||||
| 			if testCase.Signed { | 			if testCase.Signed { | ||||||
| 				url += "?unsigned=false" | 				q.Set("unsigned", "false") | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			req := httptest.NewRequest("GET", url, nil) | 			if testCase.ForceResponse != "" { | ||||||
|  | 				q.Set("onUnknownProfileRespondWithUuid", testCase.ForceResponse) | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			u.RawQuery = q.Encode() | ||||||
|  | 			req := httptest.NewRequest("GET", u.String(), nil) | ||||||
| 			w := httptest.NewRecorder() | 			w := httptest.NewRecorder() | ||||||
|  |  | ||||||
| 			if testCase.PanicErr != "" { | 			if testCase.PanicErr != "" { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user