mirror of
				https://github.com/elyby/chrly.git
				synced 2025-05-31 14:11:51 +05:30 
			
		
		
		
	Resolves #23. Allow to spoof Mojang's API addresses
This commit is contained in:
		| @@ -8,7 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||||||
| ### Added | ### Added | ||||||
| - [#24](https://github.com/elyby/chrly/issues/24): Implemented a new strategy for the queue in the batch provider of | - [#24](https://github.com/elyby/chrly/issues/24): Implemented a new strategy for the queue in the batch provider of | ||||||
|   Mojang UUIDs: `full-bus`. |   Mojang UUIDs: `full-bus`. | ||||||
| - A new configuration param `QUEUE_STRATEGY` with the default value `periodic`. | - New configuration param `QUEUE_STRATEGY` with the default value `periodic`. | ||||||
|  | - New configuration params: `MOJANG_API_BASE_URL` and `MOJANG_SESSION_SERVER_BASE_URL`, that allow you to spoof | ||||||
|  |   Mojang API base addresses. | ||||||
|  |  | ||||||
| ### Changed | ### Changed | ||||||
| - `ely.skinsystem.{hostname}.app.mojang_textures.usernames.round_time` timer will not be recorded if the iteration was | - `ely.skinsystem.{hostname}.app.mojang_textures.usernames.round_time` timer will not be recorded if the iteration was | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -145,6 +145,20 @@ docker-compose up -d app | |||||||
|         </td> |         </td> | ||||||
|         <td><code>http://remote-provider.com/api/worker/mojang-uuid</code></td> |         <td><code>http://remote-provider.com/api/worker/mojang-uuid</code></td> | ||||||
|     </tr> |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>MOJANG_API_BASE_URL</td> | ||||||
|  |         <td> | ||||||
|  |             Allows you to spoof the Mojang's API server address. | ||||||
|  |         </td> | ||||||
|  |         <td><code>https://api.mojang.com</code></td> | ||||||
|  |     </tr> | ||||||
|  |     <tr> | ||||||
|  |         <td>MOJANG_SESSION_SERVER_BASE_URL</td> | ||||||
|  |         <td> | ||||||
|  |             Allows you to spoof the Mojang's Session server address. | ||||||
|  |         </td> | ||||||
|  |         <td><code>https://sessionserver.mojang.com</code></td> | ||||||
|  |     </tr> | ||||||
|     <tr> |     <tr> | ||||||
|         <td>TEXTURES_EXTRA_PARAM_NAME</td> |         <td>TEXTURES_EXTRA_PARAM_NAME</td> | ||||||
|         <td> |         <td> | ||||||
|   | |||||||
| @@ -58,11 +58,17 @@ type ProfileInfo struct { | |||||||
| 	IsDemo   bool   `json:"demo,omitempty"` | 	IsDemo   bool   `json:"demo,omitempty"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | var ApiMojangDotComAddr = "https://api.mojang.com" | ||||||
|  | var SessionServerMojangComAddr = "https://sessionserver.mojang.com" | ||||||
|  |  | ||||||
| // Exchanges usernames array to array of uuids | // Exchanges usernames array to array of uuids | ||||||
| // See https://wiki.vg/Mojang_API#Playernames_-.3E_UUIDs | // See https://wiki.vg/Mojang_API#Playernames_-.3E_UUIDs | ||||||
| func UsernamesToUuids(usernames []string) ([]*ProfileInfo, error) { | func UsernamesToUuids(usernames []string) ([]*ProfileInfo, error) { | ||||||
| 	requestBody, _ := json.Marshal(usernames) | 	requestBody, _ := json.Marshal(usernames) | ||||||
| 	request, _ := http.NewRequest("POST", "https://api.mojang.com/profiles/minecraft", bytes.NewBuffer(requestBody)) | 	request, err := http.NewRequest("POST", ApiMojangDotComAddr+"/profiles/minecraft", bytes.NewBuffer(requestBody)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	request.Header.Set("Content-Type", "application/json") | 	request.Header.Set("Content-Type", "application/json") | ||||||
|  |  | ||||||
| @@ -88,12 +94,15 @@ func UsernamesToUuids(usernames []string) ([]*ProfileInfo, error) { | |||||||
| // See https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape | // See https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape | ||||||
| func UuidToTextures(uuid string, signed bool) (*SignedTexturesResponse, error) { | func UuidToTextures(uuid string, signed bool) (*SignedTexturesResponse, error) { | ||||||
| 	normalizedUuid := strings.ReplaceAll(uuid, "-", "") | 	normalizedUuid := strings.ReplaceAll(uuid, "-", "") | ||||||
| 	url := "https://sessionserver.mojang.com/session/minecraft/profile/" + normalizedUuid | 	url := SessionServerMojangComAddr + "/session/minecraft/profile/" + normalizedUuid | ||||||
| 	if signed { | 	if signed { | ||||||
| 		url += "?unsigned=false" | 		url += "?unsigned=false" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	request, _ := http.NewRequest("GET", url, nil) | 	request, err := http.NewRequest("GET", url, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	response, err := HttpClient.Do(request) | 	response, err := HttpClient.Do(request) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -9,12 +9,14 @@ import ( | |||||||
| 	"github.com/goava/di" | 	"github.com/goava/di" | ||||||
| 	"github.com/spf13/viper" | 	"github.com/spf13/viper" | ||||||
|  |  | ||||||
|  | 	"github.com/elyby/chrly/api/mojang" | ||||||
| 	es "github.com/elyby/chrly/eventsubscribers" | 	es "github.com/elyby/chrly/eventsubscribers" | ||||||
| 	"github.com/elyby/chrly/http" | 	"github.com/elyby/chrly/http" | ||||||
| 	"github.com/elyby/chrly/mojangtextures" | 	"github.com/elyby/chrly/mojangtextures" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var mojangTextures = di.Options( | var mojangTextures = di.Options( | ||||||
|  | 	di.Invoke(interceptMojangApiUrls), | ||||||
| 	di.Provide(newMojangTexturesProviderFactory), | 	di.Provide(newMojangTexturesProviderFactory), | ||||||
| 	di.Provide(newMojangTexturesProvider), | 	di.Provide(newMojangTexturesProvider), | ||||||
| 	di.Provide(newMojangTexturesUuidsProviderFactory), | 	di.Provide(newMojangTexturesUuidsProviderFactory), | ||||||
| @@ -27,6 +29,30 @@ var mojangTextures = di.Options( | |||||||
| 	di.Provide(newMojangTexturesStorageFactory), | 	di.Provide(newMojangTexturesStorageFactory), | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func interceptMojangApiUrls(config *viper.Viper) error { | ||||||
|  | 	apiUrl := config.GetString("mojang.api_base_url") | ||||||
|  | 	if apiUrl != "" { | ||||||
|  | 		u, err := url.ParseRequestURI(apiUrl) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mojang.ApiMojangDotComAddr = u.String() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	sessionServerUrl := config.GetString("mojang.session_server_base_url") | ||||||
|  | 	if sessionServerUrl != "" { | ||||||
|  | 		u, err := url.ParseRequestURI(apiUrl) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mojang.SessionServerMojangComAddr = u.String() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func newMojangTexturesProviderFactory( | func newMojangTexturesProviderFactory( | ||||||
| 	container *di.Container, | 	container *di.Container, | ||||||
| 	config *viper.Viper, | 	config *viper.Viper, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user