mirror of
https://github.com/elyby/chrly.git
synced 2025-01-03 10:41:47 +05:30
Remove validation rules for a hash field
This commit is contained in:
parent
1f057a27aa
commit
ab78af33a5
@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Changed
|
### Changed
|
||||||
- Improved Keep-Alive settings for HTTP client used to perform requests to Mojang's APIs
|
- Improved Keep-Alive settings for HTTP client used to perform requests to Mojang's APIs.
|
||||||
- Mojang's textures queue now has static delay of 1 second after each iteration to prevent strange `429` errors.
|
- Mojang's textures queue now has static delay of 1 second after each iteration to prevent strange `429` errors.
|
||||||
- Mojang's textures queue now caches even errored responses for signed textures to avoid `429` errors.
|
- Mojang's textures queue now caches even errored responses for signed textures to avoid `429` errors.
|
||||||
- Mojang's textures queue now caches textures data for 70 seconds to avoid strange `429` errors.
|
- Mojang's textures queue now caches textures data for 70 seconds to avoid strange `429` errors.
|
||||||
@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
- Panic when Redis connection is broken.
|
- Panic when Redis connection is broken.
|
||||||
- Duplication of Redis connections pool for Mojang's textures queue.
|
- Duplication of Redis connections pool for Mojang's textures queue.
|
||||||
|
- Removed validation rules for `hash` field.
|
||||||
|
|
||||||
## [4.2.0] - 2019-05-02
|
## [4.2.0] - 2019-05-02
|
||||||
### Added
|
### Added
|
||||||
|
14
http/api.go
14
http/api.go
@ -152,7 +152,7 @@ func validatePostSkinRequest(request *http.Request) map[string][]string {
|
|||||||
const maxMultipartMemory int64 = 32 << 20
|
const maxMultipartMemory int64 = 32 << 20
|
||||||
const oneOfSkinOrUrlMessage = "One of url or skin should be provided, but not both"
|
const oneOfSkinOrUrlMessage = "One of url or skin should be provided, but not both"
|
||||||
|
|
||||||
request.ParseMultipartForm(maxMultipartMemory)
|
_ = request.ParseMultipartForm(maxMultipartMemory)
|
||||||
|
|
||||||
validationRules := govalidator.MapData{
|
validationRules := govalidator.MapData{
|
||||||
"identityId": {"required", "numeric", "min:1"},
|
"identityId": {"required", "numeric", "min:1"},
|
||||||
@ -161,7 +161,6 @@ func validatePostSkinRequest(request *http.Request) map[string][]string {
|
|||||||
"skinId": {"required", "numeric", "min:1"},
|
"skinId": {"required", "numeric", "min:1"},
|
||||||
"url": {"url"},
|
"url": {"url"},
|
||||||
"file:skin": {"ext:png", "size:24576", "mime:image/png"},
|
"file:skin": {"ext:png", "size:24576", "mime:image/png"},
|
||||||
"hash": {},
|
|
||||||
"is1_8": {"bool"},
|
"is1_8": {"bool"},
|
||||||
"isSlim": {"bool"},
|
"isSlim": {"bool"},
|
||||||
}
|
}
|
||||||
@ -174,7 +173,6 @@ func validatePostSkinRequest(request *http.Request) map[string][]string {
|
|||||||
} else if skinErr == nil {
|
} else if skinErr == nil {
|
||||||
validationRules["file:skin"] = append(validationRules["file:skin"], "skinUploadingNotAvailable")
|
validationRules["file:skin"] = append(validationRules["file:skin"], "skinUploadingNotAvailable")
|
||||||
} else if url != "" {
|
} else if url != "" {
|
||||||
validationRules["hash"] = append(validationRules["hash"], "required")
|
|
||||||
validationRules["is1_8"] = append(validationRules["is1_8"], "required")
|
validationRules["is1_8"] = append(validationRules["is1_8"], "required")
|
||||||
validationRules["isSlim"] = append(validationRules["isSlim"], "required")
|
validationRules["isSlim"] = append(validationRules["isSlim"], "required")
|
||||||
}
|
}
|
||||||
@ -213,7 +211,7 @@ func findIdentity(repo interfaces.SkinsRepository, identityId int, username stri
|
|||||||
|
|
||||||
record, err = repo.FindByUsername(username)
|
record, err = repo.FindByUsername(username)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
repo.RemoveByUsername(username)
|
_ = repo.RemoveByUsername(username)
|
||||||
record.UserId = identityId
|
record.UserId = identityId
|
||||||
} else {
|
} else {
|
||||||
record = &model.Skin{
|
record = &model.Skin{
|
||||||
@ -222,7 +220,7 @@ func findIdentity(repo interfaces.SkinsRepository, identityId int, username stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if record.Username != username {
|
} else if record.Username != username {
|
||||||
repo.RemoveByUserId(identityId)
|
_ = repo.RemoveByUserId(identityId)
|
||||||
record.Username = username
|
record.Username = username
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,7 +233,7 @@ func apiBadRequest(resp http.ResponseWriter, errorsPerField map[string][]string)
|
|||||||
result, _ := json.Marshal(map[string]interface{}{
|
result, _ := json.Marshal(map[string]interface{}{
|
||||||
"errors": errorsPerField,
|
"errors": errorsPerField,
|
||||||
})
|
})
|
||||||
resp.Write(result)
|
_, _ = resp.Write(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiForbidden(resp http.ResponseWriter, reason string) {
|
func apiForbidden(resp http.ResponseWriter, reason string) {
|
||||||
@ -244,7 +242,7 @@ func apiForbidden(resp http.ResponseWriter, reason string) {
|
|||||||
result, _ := json.Marshal(map[string]interface{}{
|
result, _ := json.Marshal(map[string]interface{}{
|
||||||
"error": reason,
|
"error": reason,
|
||||||
})
|
})
|
||||||
resp.Write(result)
|
_, _ = resp.Write(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiNotFound(resp http.ResponseWriter, reason string) {
|
func apiNotFound(resp http.ResponseWriter, reason string) {
|
||||||
@ -253,7 +251,7 @@ func apiNotFound(resp http.ResponseWriter, reason string) {
|
|||||||
result, _ := json.Marshal([]interface{}{
|
result, _ := json.Marshal([]interface{}{
|
||||||
reason,
|
reason,
|
||||||
})
|
})
|
||||||
resp.Write(result)
|
_, _ = resp.Write(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServerError(resp http.ResponseWriter) {
|
func apiServerError(resp http.ResponseWriter) {
|
||||||
|
@ -28,7 +28,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
|
|
||||||
resultModel := createSkinModel("mock_user", false)
|
resultModel := createSkinModel("mock_user", false)
|
||||||
resultModel.SkinId = 5
|
resultModel.SkinId = 5
|
||||||
resultModel.Url = "http://ely.by/minecraft/skins/default.png"
|
resultModel.Url = "http://example.com/skin.png"
|
||||||
resultModel.MojangTextures = ""
|
resultModel.MojangTextures = ""
|
||||||
resultModel.MojangSignature = ""
|
resultModel.MojangSignature = ""
|
||||||
|
|
||||||
@ -37,13 +37,12 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
"username": {"mock_user"},
|
"username": {"mock_user"},
|
||||||
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
||||||
"skinId": {"5"},
|
"skinId": {"5"},
|
||||||
"hash": {"94a457d92a61460cb9cb5d6f29732d2a"},
|
|
||||||
"is1_8": {"0"},
|
"is1_8": {"0"},
|
||||||
"isSlim": {"0"},
|
"isSlim": {"0"},
|
||||||
"url": {"http://ely.by/minecraft/skins/default.png"},
|
"url": {"http://example.com/skin.png"},
|
||||||
}
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode()))
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode()))
|
||||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -89,7 +88,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", body)
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", body)
|
||||||
req.Header.Add("Content-Type", writer.FormDataContentType())
|
req.Header.Add("Content-Type", writer.FormDataContentType())
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -141,7 +140,6 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
"username": {"mock_user"},
|
"username": {"mock_user"},
|
||||||
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
||||||
"skinId": {"5"},
|
"skinId": {"5"},
|
||||||
"hash": {"94a457d92a61460cb9cb5d6f29732d2a"},
|
|
||||||
"is1_8": {"0"},
|
"is1_8": {"0"},
|
||||||
"isSlim": {"0"},
|
"isSlim": {"0"},
|
||||||
"url": {"http://textures-server.com/skin.png"},
|
"url": {"http://textures-server.com/skin.png"},
|
||||||
@ -171,7 +169,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
resultModel := createSkinModel("mock_user", false)
|
resultModel := createSkinModel("mock_user", false)
|
||||||
resultModel.UserId = 2
|
resultModel.UserId = 2
|
||||||
resultModel.SkinId = 5
|
resultModel.SkinId = 5
|
||||||
resultModel.Url = "http://ely.by/minecraft/skins/default.png"
|
resultModel.Url = "http://example.com/skin.png"
|
||||||
resultModel.MojangTextures = ""
|
resultModel.MojangTextures = ""
|
||||||
resultModel.MojangSignature = ""
|
resultModel.MojangSignature = ""
|
||||||
|
|
||||||
@ -180,13 +178,12 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
"username": {"mock_user"},
|
"username": {"mock_user"},
|
||||||
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
||||||
"skinId": {"5"},
|
"skinId": {"5"},
|
||||||
"hash": {"94a457d92a61460cb9cb5d6f29732d2a"},
|
|
||||||
"is1_8": {"0"},
|
"is1_8": {"0"},
|
||||||
"isSlim": {"0"},
|
"isSlim": {"0"},
|
||||||
"url": {"http://ely.by/minecraft/skins/default.png"},
|
"url": {"http://example.com/skin.png"},
|
||||||
}
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode()))
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode()))
|
||||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -219,7 +216,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
|
|
||||||
resultModel := createSkinModel("changed_username", false)
|
resultModel := createSkinModel("changed_username", false)
|
||||||
resultModel.SkinId = 5
|
resultModel.SkinId = 5
|
||||||
resultModel.Url = "http://ely.by/minecraft/skins/default.png"
|
resultModel.Url = "http://example.com/skin.png"
|
||||||
resultModel.MojangTextures = ""
|
resultModel.MojangTextures = ""
|
||||||
resultModel.MojangSignature = ""
|
resultModel.MojangSignature = ""
|
||||||
|
|
||||||
@ -228,13 +225,12 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
"username": {"changed_username"},
|
"username": {"changed_username"},
|
||||||
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
"uuid": {"0f657aa8-bfbe-415d-b700-5750090d3af3"},
|
||||||
"skinId": {"5"},
|
"skinId": {"5"},
|
||||||
"hash": {"94a457d92a61460cb9cb5d6f29732d2a"},
|
|
||||||
"is1_8": {"0"},
|
"is1_8": {"0"},
|
||||||
"isSlim": {"0"},
|
"isSlim": {"0"},
|
||||||
"url": {"http://ely.by/minecraft/skins/default.png"},
|
"url": {"http://example.com/skin.png"},
|
||||||
}
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode()))
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode()))
|
||||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -268,7 +264,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
"mojangTextures": {"someBase64EncodedString"},
|
"mojangTextures": {"someBase64EncodedString"},
|
||||||
}
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", bytes.NewBufferString(form.Encode()))
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", bytes.NewBufferString(form.Encode()))
|
||||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -324,7 +320,7 @@ func TestConfig_PostSkin(t *testing.T) {
|
|||||||
|
|
||||||
config, mocks := setupMocks(ctrl)
|
config, mocks := setupMocks(ctrl)
|
||||||
|
|
||||||
req := httptest.NewRequest("POST", "http://skinsystem.ely.by/api/skins", nil)
|
req := httptest.NewRequest("POST", "http://chrly/api/skins", nil)
|
||||||
req.Header.Add("Authorization", "Bearer invalid.jwt.token")
|
req.Header.Add("Authorization", "Bearer invalid.jwt.token")
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
@ -353,7 +349,7 @@ func TestConfig_DeleteSkinByUserId(t *testing.T) {
|
|||||||
|
|
||||||
config, mocks := setupMocks(ctrl)
|
config, mocks := setupMocks(ctrl)
|
||||||
|
|
||||||
req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/id:1", nil)
|
req := httptest.NewRequest("DELETE", "http://chrly/api/skins/id:1", nil)
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
||||||
@ -381,7 +377,7 @@ func TestConfig_DeleteSkinByUserId(t *testing.T) {
|
|||||||
|
|
||||||
config, mocks := setupMocks(ctrl)
|
config, mocks := setupMocks(ctrl)
|
||||||
|
|
||||||
req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/id:2", nil)
|
req := httptest.NewRequest("DELETE", "http://chrly/api/skins/id:2", nil)
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
||||||
@ -412,7 +408,7 @@ func TestConfig_DeleteSkinByUsername(t *testing.T) {
|
|||||||
|
|
||||||
config, mocks := setupMocks(ctrl)
|
config, mocks := setupMocks(ctrl)
|
||||||
|
|
||||||
req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/mock_user", nil)
|
req := httptest.NewRequest("DELETE", "http://chrly/api/skins/mock_user", nil)
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
||||||
@ -440,7 +436,7 @@ func TestConfig_DeleteSkinByUsername(t *testing.T) {
|
|||||||
|
|
||||||
config, mocks := setupMocks(ctrl)
|
config, mocks := setupMocks(ctrl)
|
||||||
|
|
||||||
req := httptest.NewRequest("DELETE", "http://skinsystem.ely.by/api/skins/mock_user_2", nil)
|
req := httptest.NewRequest("DELETE", "http://chrly/api/skins/mock_user_2", nil)
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
|
|
||||||
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
mocks.Auth.EXPECT().Check(gomock.Any()).Return(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user