├── .gitattributes ├── .github └── workflows │ └── push.yml ├── .gitignore ├── .gitmodules ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── LICENSE ├── LaunchServer ├── build.gradle └── src │ ├── main │ ├── java │ │ └── pro │ │ │ └── gravit │ │ │ └── launchserver │ │ │ ├── HttpRequester.java │ │ │ ├── LaunchServer.java │ │ │ ├── LaunchServerBuilder.java │ │ │ ├── LaunchServerStarter.java │ │ │ ├── Main.java │ │ │ ├── Reconfigurable.java │ │ │ ├── StarterAgent.java │ │ │ ├── asm │ │ │ ├── ClassMetadataReader.java │ │ │ ├── InjectClassAcceptor.java │ │ │ ├── NodeUtils.java │ │ │ └── SafeClassWriter.java │ │ │ ├── auth │ │ │ ├── AuthException.java │ │ │ ├── AuthProviderPair.java │ │ │ ├── Feature.java │ │ │ ├── Features.java │ │ │ ├── HikariSQLSourceConfig.java │ │ │ ├── MySQLSourceConfig.java │ │ │ ├── PostgreSQLSourceConfig.java │ │ │ ├── SQLSourceConfig.java │ │ │ ├── core │ │ │ │ ├── AbstractSQLCoreProvider.java │ │ │ │ ├── AuthCoreProvider.java │ │ │ │ ├── MemoryAuthCoreProvider.java │ │ │ │ ├── MergeAuthCoreProvider.java │ │ │ │ ├── MySQLCoreProvider.java │ │ │ │ ├── PostgresSQLCoreProvider.java │ │ │ │ ├── RejectAuthCoreProvider.java │ │ │ │ ├── SQLCoreProvider.java │ │ │ │ ├── User.java │ │ │ │ ├── UserSession.java │ │ │ │ ├── interfaces │ │ │ │ │ ├── UserHardware.java │ │ │ │ │ ├── provider │ │ │ │ │ │ ├── AuthSupport.java │ │ │ │ │ │ ├── AuthSupportAssetUpload.java │ │ │ │ │ │ ├── AuthSupportExit.java │ │ │ │ │ │ ├── AuthSupportExtendedCheckServer.java │ │ │ │ │ │ ├── AuthSupportGetAllUsers.java │ │ │ │ │ │ ├── AuthSupportHardware.java │ │ │ │ │ │ ├── AuthSupportRegistration.java │ │ │ │ │ │ └── AuthSupportSudo.java │ │ │ │ │ ├── session │ │ │ │ │ │ ├── UserSessionSupportHardware.java │ │ │ │ │ │ ├── UserSessionSupportKeys.java │ │ │ │ │ │ └── UserSessionSupportProperties.java │ │ │ │ │ └── user │ │ │ │ │ │ ├── UserSupportAdditionalData.java │ │ │ │ │ │ ├── UserSupportProperties.java │ │ │ │ │ │ └── UserSupportTextures.java │ │ │ │ └── openid │ │ │ │ │ ├── AccessTokenResponse.java │ │ │ │ │ ├── OpenIDAuthCoreProvider.java │ │ │ │ │ ├── OpenIDAuthenticator.java │ │ │ │ │ ├── OpenIDConfig.java │ │ │ │ │ ├── QueryBuilder.java │ │ │ │ │ ├── SQLServerSessionStore.java │ │ │ │ │ ├── SQLUserStore.java │ │ │ │ │ ├── ServerSessionStore.java │ │ │ │ │ ├── TokenResponse.java │ │ │ │ │ ├── UserEntity.java │ │ │ │ │ └── UserStore.java │ │ │ ├── mix │ │ │ │ ├── MixProvider.java │ │ │ │ └── UploadAssetMixProvider.java │ │ │ ├── password │ │ │ │ ├── AcceptPasswordVerifier.java │ │ │ │ ├── BCryptPasswordVerifier.java │ │ │ │ ├── DigestPasswordVerifier.java │ │ │ │ ├── DoubleDigestPasswordVerifier.java │ │ │ │ ├── JsonPasswordVerifier.java │ │ │ │ ├── PasswordVerifier.java │ │ │ │ ├── PlainPasswordVerifier.java │ │ │ │ └── RejectPasswordVerifier.java │ │ │ ├── profiles │ │ │ │ ├── LocalProfileProvider.java │ │ │ │ └── ProfileProvider.java │ │ │ ├── protect │ │ │ │ ├── AdvancedProtectHandler.java │ │ │ │ ├── NoProtectHandler.java │ │ │ │ ├── ProtectHandler.java │ │ │ │ ├── StdProtectHandler.java │ │ │ │ └── interfaces │ │ │ │ │ ├── HardwareProtectHandler.java │ │ │ │ │ ├── JoinServerProtectHandler.java │ │ │ │ │ ├── ProfilesProtectHandler.java │ │ │ │ │ └── SecureProtectHandler.java │ │ │ ├── texture │ │ │ │ ├── JsonTextureProvider.java │ │ │ │ ├── NullTextureProvider.java │ │ │ │ ├── RequestTextureProvider.java │ │ │ │ ├── TextureProvider.java │ │ │ │ └── VoidTextureProvider.java │ │ │ └── updates │ │ │ │ ├── LocalUpdatesProvider.java │ │ │ │ └── UpdatesProvider.java │ │ │ ├── binary │ │ │ ├── BinaryPipeline.java │ │ │ ├── BuildContext.java │ │ │ ├── EXELauncherBinary.java │ │ │ ├── JARLauncherBinary.java │ │ │ ├── LauncherBinary.java │ │ │ ├── SignerJar.java │ │ │ └── tasks │ │ │ │ ├── AdditionalFixesApplyTask.java │ │ │ │ ├── AttachJarsTask.java │ │ │ │ ├── CertificateAutogenTask.java │ │ │ │ ├── CompressBuildTask.java │ │ │ │ ├── LauncherBuildTask.java │ │ │ │ ├── MainBuildTask.java │ │ │ │ ├── PrepareBuildTask.java │ │ │ │ ├── SignJarTask.java │ │ │ │ └── exe │ │ │ │ └── BuildExeMainTask.java │ │ │ ├── command │ │ │ ├── Command.java │ │ │ ├── basic │ │ │ │ ├── BuildCommand.java │ │ │ │ ├── DebugCommand.java │ │ │ │ ├── StopCommand.java │ │ │ │ └── VersionCommand.java │ │ │ ├── handler │ │ │ │ └── CommandHandler.java │ │ │ ├── hash │ │ │ │ ├── DownloadAssetCommand.java │ │ │ │ ├── DownloadClientCommand.java │ │ │ │ ├── IndexAssetCommand.java │ │ │ │ └── UnindexAssetCommand.java │ │ │ ├── modules │ │ │ │ ├── LoadModuleCommand.java │ │ │ │ └── ModulesCommand.java │ │ │ ├── profiles │ │ │ │ ├── CloneProfileCommand.java │ │ │ │ ├── DeleteProfileCommand.java │ │ │ │ ├── ListProfilesCommand.java │ │ │ │ ├── MakeProfileCommand.java │ │ │ │ ├── ProfilesCommand.java │ │ │ │ └── SaveProfilesCommand.java │ │ │ ├── service │ │ │ │ ├── ClientsCommand.java │ │ │ │ ├── ComponentCommand.java │ │ │ │ ├── ConfigCommand.java │ │ │ │ ├── NotifyCommand.java │ │ │ │ ├── SecurityCheckCommand.java │ │ │ │ ├── ServerStatusCommand.java │ │ │ │ └── TokenCommand.java │ │ │ ├── sync │ │ │ │ ├── SyncBinariesCommand.java │ │ │ │ ├── SyncCommand.java │ │ │ │ ├── SyncLauncherModulesCommand.java │ │ │ │ ├── SyncProfilesCommand.java │ │ │ │ ├── SyncUPCommand.java │ │ │ │ ├── SyncUpdatesCacheCommand.java │ │ │ │ └── SyncUpdatesCommand.java │ │ │ └── tools │ │ │ │ ├── SignDirCommand.java │ │ │ │ └── SignJarCommand.java │ │ │ ├── components │ │ │ ├── AbstractLimiter.java │ │ │ ├── AuthLimiterComponent.java │ │ │ ├── CommandRemoverComponent.java │ │ │ ├── Component.java │ │ │ ├── IPLimiter.java │ │ │ ├── ProGuardComponent.java │ │ │ └── WhitelistComponent.java │ │ │ ├── config │ │ │ ├── LaunchServerConfig.java │ │ │ ├── LaunchServerRuntimeConfig.java │ │ │ └── log4j │ │ │ │ └── LogAppender.java │ │ │ ├── helper │ │ │ ├── DamerauHelper.java │ │ │ ├── HttpHelper.java │ │ │ ├── LegacySessionHelper.java │ │ │ ├── MakeProfileHelper.java │ │ │ └── SignHelper.java │ │ │ ├── holder │ │ │ └── LaunchServerControlHolder.java │ │ │ ├── launchermodules │ │ │ ├── LauncherModuleClassLoader.java │ │ │ └── LauncherModuleLoader.java │ │ │ ├── manangers │ │ │ ├── AuthManager.java │ │ │ ├── CertificateManager.java │ │ │ ├── ConfigManager.java │ │ │ ├── FeaturesManager.java │ │ │ ├── KeyAgreementManager.java │ │ │ ├── LaunchServerGsonManager.java │ │ │ ├── MirrorManager.java │ │ │ ├── ReconfigurableManager.java │ │ │ ├── UpdatesManager.java │ │ │ └── hook │ │ │ │ └── AuthHookManager.java │ │ │ ├── modules │ │ │ ├── events │ │ │ │ ├── LaunchServerFullInitEvent.java │ │ │ │ ├── LaunchServerInitPhase.java │ │ │ │ ├── LaunchServerLauncherExeInit.java │ │ │ │ ├── LaunchServerNettyFullInitEvent.java │ │ │ │ ├── LaunchServerPostInitPhase.java │ │ │ │ ├── LaunchServerProfilesSyncEvent.java │ │ │ │ ├── LaunchServerUpdatesSyncEvent.java │ │ │ │ ├── NewLaunchServerInstanceEvent.java │ │ │ │ └── security │ │ │ │ │ └── SecurityReportModuleEvent.java │ │ │ └── impl │ │ │ │ ├── LaunchServerCoreModule.java │ │ │ │ ├── LaunchServerInitContext.java │ │ │ │ └── LaunchServerModulesManager.java │ │ │ └── socket │ │ │ ├── Client.java │ │ │ ├── LauncherNettyServer.java │ │ │ ├── NettyConnectContext.java │ │ │ ├── NettyObjectFactory.java │ │ │ ├── NettyThreadFactory.java │ │ │ ├── SocketCommandServer.java │ │ │ ├── WebSocketService.java │ │ │ ├── handlers │ │ │ ├── ContentType.java │ │ │ ├── NettyIpForwardHandler.java │ │ │ ├── NettyServerSocketHandler.java │ │ │ ├── NettyWebAPIHandler.java │ │ │ ├── WebSocketFrameHandler.java │ │ │ └── fileserver │ │ │ │ ├── ClosingChannelFutureListener.java │ │ │ │ └── FileServerHandler.java │ │ │ ├── response │ │ │ ├── SimpleResponse.java │ │ │ ├── UnknownResponse.java │ │ │ ├── WebSocketServerResponse.java │ │ │ ├── auth │ │ │ │ ├── AdditionalDataResponse.java │ │ │ │ ├── AuthResponse.java │ │ │ │ ├── CheckServerResponse.java │ │ │ │ ├── CurrentUserResponse.java │ │ │ │ ├── ExitResponse.java │ │ │ │ ├── FetchClientProfileKeyResponse.java │ │ │ │ ├── GetAvailabilityAuthResponse.java │ │ │ │ ├── JoinServerResponse.java │ │ │ │ ├── ProfilesResponse.java │ │ │ │ ├── RefreshTokenResponse.java │ │ │ │ ├── RestoreResponse.java │ │ │ │ └── SetProfileResponse.java │ │ │ ├── cabinet │ │ │ │ ├── AssetUploadInfoResponse.java │ │ │ │ └── GetAssetUploadInfoResponse.java │ │ │ ├── management │ │ │ │ ├── FeaturesResponse.java │ │ │ │ ├── GetConnectUUIDResponse.java │ │ │ │ └── GetPublicKeyResponse.java │ │ │ ├── profile │ │ │ │ ├── BatchProfileByUsername.java │ │ │ │ ├── ProfileByUUIDResponse.java │ │ │ │ └── ProfileByUsername.java │ │ │ ├── secure │ │ │ │ ├── GetSecureLevelInfoResponse.java │ │ │ │ ├── HardwareReportResponse.java │ │ │ │ ├── SecurityReportResponse.java │ │ │ │ └── VerifySecureLevelKeyResponse.java │ │ │ └── update │ │ │ │ ├── LauncherResponse.java │ │ │ │ └── UpdateResponse.java │ │ │ └── severlet │ │ │ └── StatusSeverlet.java │ └── resources │ │ ├── experimental-build.json │ │ ├── log4j2.xml │ │ └── pro │ │ └── gravit │ │ └── launchserver │ │ └── defaults │ │ └── proguard.cfg │ └── test │ ├── java │ └── pro │ │ └── gravit │ │ └── launchserver │ │ ├── ASMTransformersTest.java │ │ ├── ConfigurationTest.java │ │ ├── FeatureCollectionTest.java │ │ ├── StartLaunchServerTest.java │ │ └── impl │ │ └── TestLaunchServerConfigManager.java │ └── resources │ └── log4j2.xml ├── Launcher ├── build.gradle ├── runtime │ └── README.txt └── src │ └── main │ └── java │ └── pro │ └── gravit │ └── launcher │ └── runtime │ ├── LauncherEngine.java │ ├── LauncherEngineWrapper.java │ ├── NewLauncherSettings.java │ ├── client │ ├── ClientLauncherProcess.java │ ├── DirBridge.java │ ├── RuntimeGsonManager.java │ ├── ServerPinger.java │ ├── UserSettings.java │ └── events │ │ ├── ClientEngineInitPhase.java │ │ ├── ClientGuiPhase.java │ │ ├── ClientPreGuiPhase.java │ │ ├── ClientProcessBuilderCreateEvent.java │ │ ├── ClientProcessBuilderLaunchedEvent.java │ │ ├── ClientProcessBuilderParamsWrittedEvent.java │ │ └── ClientProcessBuilderPreLaunchEvent.java │ ├── console │ ├── GetConnectUUIDCommand.java │ ├── GetPublicKeyCommand.java │ ├── ModulesCommand.java │ ├── SignDataCommand.java │ ├── UnlockCommand.java │ └── test │ │ └── PrintHardwareInfoCommand.java │ ├── debug │ ├── ClientRuntimeProvider.java │ ├── DebugLauncherTrustManager.java │ ├── DebugMain.java │ └── DebugMainInlineInitializer.java │ ├── gui │ ├── NoRuntimeProvider.java │ └── RuntimeProvider.java │ ├── managers │ ├── ConsoleManager.java │ └── SettingsManager.java │ └── utils │ ├── HWIDProvider.java │ └── LauncherUpdater.java ├── LauncherAPI ├── build.gradle └── src │ ├── main │ └── java │ │ └── pro │ │ └── gravit │ │ └── launcher │ │ └── base │ │ ├── ClientPermissions.java │ │ ├── Downloader.java │ │ ├── Launcher.java │ │ ├── LauncherConfig.java │ │ ├── api │ │ ├── AuthService.java │ │ ├── ClientService.java │ │ ├── ConfigService.java │ │ └── KeyService.java │ │ ├── config │ │ ├── JsonConfigurable.java │ │ ├── JsonConfigurableInterface.java │ │ ├── SimpleConfig.java │ │ └── SimpleConfigurable.java │ │ ├── events │ │ ├── ExtendedTokenRequestEvent.java │ │ ├── NotificationEvent.java │ │ ├── RequestEvent.java │ │ └── request │ │ │ ├── AdditionalDataRequestEvent.java │ │ │ ├── AssetUploadInfoRequestEvent.java │ │ │ ├── AuthRequestEvent.java │ │ │ ├── BatchProfileByUsernameRequestEvent.java │ │ │ ├── CheckServerRequestEvent.java │ │ │ ├── CurrentUserRequestEvent.java │ │ │ ├── ErrorRequestEvent.java │ │ │ ├── ExitRequestEvent.java │ │ │ ├── FeaturesRequestEvent.java │ │ │ ├── FetchClientProfileKeyRequestEvent.java │ │ │ ├── GetAssetUploadUrlRequestEvent.java │ │ │ ├── GetAvailabilityAuthRequestEvent.java │ │ │ ├── GetConnectUUIDRequestEvent.java │ │ │ ├── GetPublicKeyRequestEvent.java │ │ │ ├── GetSecureLevelInfoRequestEvent.java │ │ │ ├── HardwareReportRequestEvent.java │ │ │ ├── JoinServerRequestEvent.java │ │ │ ├── LauncherRequestEvent.java │ │ │ ├── ProfileByUUIDRequestEvent.java │ │ │ ├── ProfileByUsernameRequestEvent.java │ │ │ ├── ProfilesRequestEvent.java │ │ │ ├── RefreshTokenRequestEvent.java │ │ │ ├── RestoreRequestEvent.java │ │ │ ├── SecurityReportRequestEvent.java │ │ │ ├── SetProfileRequestEvent.java │ │ │ ├── UpdateRequestEvent.java │ │ │ └── VerifySecureLevelKeyRequestEvent.java │ │ ├── modules │ │ ├── LauncherInitContext.java │ │ ├── LauncherModule.java │ │ ├── LauncherModuleInfo.java │ │ ├── LauncherModulesContext.java │ │ ├── LauncherModulesManager.java │ │ ├── ModulesConfigManager.java │ │ ├── events │ │ │ ├── ClosePhase.java │ │ │ ├── InitPhase.java │ │ │ ├── OfflineModeEvent.java │ │ │ ├── PostInitPhase.java │ │ │ ├── PreConfigPhase.java │ │ │ └── PreGsonPhase.java │ │ └── impl │ │ │ ├── SimpleModuleContext.java │ │ │ ├── SimpleModuleManager.java │ │ │ └── SimpleModulesConfigManager.java │ │ ├── profiles │ │ ├── ClientProfile.java │ │ ├── ClientProfileBuilder.java │ │ ├── ClientProfileVersions.java │ │ ├── PlayerProfile.java │ │ ├── Texture.java │ │ └── optional │ │ │ ├── OptionalDepend.java │ │ │ ├── OptionalFile.java │ │ │ ├── OptionalView.java │ │ │ ├── actions │ │ │ ├── OptionalAction.java │ │ │ ├── OptionalActionClassPath.java │ │ │ ├── OptionalActionClientArgs.java │ │ │ ├── OptionalActionFile.java │ │ │ └── OptionalActionJvmArgs.java │ │ │ └── triggers │ │ │ ├── ArchTrigger.java │ │ │ ├── JavaTrigger.java │ │ │ ├── OSTrigger.java │ │ │ ├── OptionalTrigger.java │ │ │ └── OptionalTriggerContext.java │ │ └── request │ │ ├── JsonResultSerializeAdapter.java │ │ ├── PingRequest.java │ │ ├── Request.java │ │ ├── RequestException.java │ │ ├── RequestService.java │ │ ├── WebSocketEvent.java │ │ ├── auth │ │ ├── AdditionalDataRequest.java │ │ ├── AuthRequest.java │ │ ├── CheckServerRequest.java │ │ ├── CurrentUserRequest.java │ │ ├── ExitRequest.java │ │ ├── FetchClientProfileKeyRequest.java │ │ ├── GetAvailabilityAuthRequest.java │ │ ├── GetPublicKeyRequest.java │ │ ├── JoinServerRequest.java │ │ ├── RefreshTokenRequest.java │ │ ├── RestoreRequest.java │ │ ├── SetProfileRequest.java │ │ ├── details │ │ │ ├── AuthLoginOnlyDetails.java │ │ │ ├── AuthPasswordDetails.java │ │ │ ├── AuthTotpDetails.java │ │ │ └── AuthWebViewDetails.java │ │ └── password │ │ │ ├── Auth2FAPassword.java │ │ │ ├── AuthAESPassword.java │ │ │ ├── AuthCodePassword.java │ │ │ ├── AuthMultiPassword.java │ │ │ ├── AuthOAuthPassword.java │ │ │ ├── AuthPlainPassword.java │ │ │ ├── AuthRSAPassword.java │ │ │ ├── AuthSignaturePassword.java │ │ │ └── AuthTOTPPassword.java │ │ ├── cabinet │ │ ├── AssetUploadInfoRequest.java │ │ └── GetAssetUploadUrl.java │ │ ├── management │ │ ├── FeaturesRequest.java │ │ └── GetConnectUUIDRequest.java │ │ ├── secure │ │ ├── GetSecureLevelInfoRequest.java │ │ ├── HardwareReportRequest.java │ │ ├── SecurityReportRequest.java │ │ └── VerifySecureLevelKeyRequest.java │ │ ├── update │ │ ├── LauncherRequest.java │ │ ├── ProfilesRequest.java │ │ └── UpdateRequest.java │ │ ├── uuid │ │ ├── BatchProfileByUsernameRequest.java │ │ ├── ProfileByUUIDRequest.java │ │ └── ProfileByUsernameRequest.java │ │ └── websockets │ │ ├── ClientJSONPoint.java │ │ ├── ClientWebSocketService.java │ │ ├── OfflineRequestService.java │ │ ├── StdWebSocketService.java │ │ ├── VoidRequestService.java │ │ └── WebSocketRequest.java │ └── test │ └── java │ └── pro │ └── gravit │ └── launcher │ ├── ClientVersionTest.java │ ├── ModulesTest.java │ ├── PermissionTest.java │ └── impl │ ├── Cyclic2DependModule.java │ ├── CyclicDependModule.java │ ├── Depend1Module.java │ ├── Depend2Module.java │ ├── Depend3Module.java │ ├── InternalModule.java │ ├── MainModule.java │ ├── ProvidedModule.java │ ├── TestModule.java │ ├── VirtualInterface.java │ └── event │ ├── CancelEvent.java │ └── NormalEvent.java ├── LauncherClient ├── build.gradle └── src │ └── main │ └── java │ └── pro │ └── gravit │ └── launcher │ └── client │ ├── BasicLauncherEventHandler.java │ ├── ClientGsonManager.java │ ├── ClientLauncherCoreModule.java │ ├── ClientLauncherEntryPoint.java │ ├── ClientLauncherMethods.java │ ├── ClientModuleManager.java │ ├── ClientParams.java │ ├── RuntimeLauncherCoreModule.java │ ├── api │ ├── CertificateService.java │ ├── DialogService.java │ └── SystemService.java │ ├── events │ ├── ClientExitPhase.java │ ├── ClientProcessClassLoaderEvent.java │ ├── ClientProcessInitPhase.java │ ├── ClientProcessLaunchEvent.java │ ├── ClientProcessPreInvokeMainClassEvent.java │ ├── ClientProcessReadyEvent.java │ └── ClientUnlockConsoleEvent.java │ └── utils │ ├── ApiBridgeService.java │ ├── DirWatcher.java │ └── NativeJVMHalt.java ├── LauncherCore ├── build.gradle └── src │ ├── main │ └── java │ │ └── pro │ │ └── gravit │ │ ├── launcher │ │ └── core │ │ │ ├── CertificatePinningTrustManager.java │ │ │ ├── LauncherInject.java │ │ │ ├── LauncherInjectionConstructor.java │ │ │ ├── LauncherNetworkAPI.java │ │ │ ├── LauncherTrustManager.java │ │ │ ├── hasher │ │ │ ├── FileNameMatcher.java │ │ │ ├── HashedDir.java │ │ │ ├── HashedEntry.java │ │ │ ├── HashedEntryAdapter.java │ │ │ └── HashedFile.java │ │ │ ├── managers │ │ │ └── GsonManager.java │ │ │ └── serialize │ │ │ ├── HInput.java │ │ │ ├── HOutput.java │ │ │ ├── signed │ │ │ └── DigestBytesHolder.java │ │ │ └── stream │ │ │ ├── EnumSerializer.java │ │ │ └── StreamObject.java │ │ └── utils │ │ ├── BiHookSet.java │ │ ├── HookException.java │ │ ├── HookSet.java │ │ ├── ProviderMap.java │ │ ├── TypeSerializeInterface.java │ │ ├── UniversalJsonAdapter.java │ │ ├── Version.java │ │ ├── command │ │ ├── BaseCommandCategory.java │ │ ├── Command.java │ │ ├── CommandCategory.java │ │ ├── CommandException.java │ │ ├── CommandHandler.java │ │ ├── JLineCommandHandler.java │ │ ├── StdCommandHandler.java │ │ ├── SubCommand.java │ │ └── basic │ │ │ ├── ClearCommand.java │ │ │ ├── DebugCommand.java │ │ │ ├── GCCommand.java │ │ │ └── HelpCommand.java │ │ ├── helper │ │ ├── CommonHelper.java │ │ ├── EnvHelper.java │ │ ├── FormatHelper.java │ │ ├── HackHelper.java │ │ ├── IOHelper.java │ │ ├── JVMHelper.java │ │ ├── JarHelper.java │ │ ├── JavaHelper.java │ │ ├── LogHelper.java │ │ ├── QueryHelper.java │ │ ├── SecurityHelper.java │ │ ├── UnpackHelper.java │ │ └── VerifyHelper.java │ │ ├── launch │ │ ├── BasicLaunch.java │ │ ├── ClassLoaderControl.java │ │ ├── Launch.java │ │ ├── LaunchOptions.java │ │ ├── LegacyLaunch.java │ │ ├── ModuleHacks.java │ │ └── ModuleLaunch.java │ │ └── logging │ │ ├── LogHelperAppender.java │ │ ├── SimpleLogHelperImpl.java │ │ └── Slf4jLogHelperImpl.java │ └── test │ └── java │ └── pro │ └── gravit │ └── launcher │ ├── CommandHandlerTest.java │ ├── SecurityHelperTests.java │ ├── SerializeTest.java │ ├── VersionCompareTest.java │ └── impl │ ├── Test2Command.java │ └── TestCommand.java ├── LauncherStart ├── build.gradle └── src │ └── main │ └── java │ └── pro │ └── gravit │ └── launcher │ └── start │ ├── ClientLauncherWrapper.java │ ├── ClientWrapperModule.java │ └── RuntimeModuleManager.java ├── README.md ├── ServerWrapper ├── build.gradle └── src │ └── main │ └── java │ └── pro │ └── gravit │ └── launcher │ └── server │ ├── ServerAgent.java │ ├── ServerWrapper.java │ ├── ServerWrapperGsonManager.java │ ├── ServerWrapperInlineInitializer.java │ ├── authlib │ ├── DownloadContextModifier.java │ ├── InstallAuthlib.java │ ├── LibrariesHashFileModifier.java │ ├── LibrariesLstModifier.java │ ├── PatchPropertiesModifier.java │ └── PatchesLstModifier.java │ └── setup │ ├── ServerWrapperCommands.java │ └── ServerWrapperSetup.java ├── build.gradle ├── get_it.sh ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── java24args.txt ├── javaargs.txt ├── props.gradle └── settings.gradle /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "modules"] 2 | path = modules 3 | url = https://github.com/GravitLauncher/LauncherModules.git 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | RUN apt-get update && apt-get install -y osslsigncode openjdk-11-jdk unzip jq screen 3 | ADD https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_linux-x64_bin-jmods.zip . 4 | RUN unzip openjfx-11.0.2_linux-x64_bin-jmods.zip && mv javafx-jmods-11.0.2/* /usr/lib/jvm/java-11-openjdk-amd64/jmods/ && rmdir javafx-jmods-11.0.2 && rm openjfx-11.0.2_linux-x64_bin-jmods.zip 5 | RUN mkdir ./libraries ./launcher-libraries ./launcher-libraries-compile ./compat ./compat/modules 6 | COPY ./LaunchServer/build/libs/LaunchServer.jar . 7 | COPY ./LaunchServer/build/libs/libraries ./libraries 8 | COPY ./LaunchServer/build/libs/launcher-libraries ./launcher-libraries 9 | COPY ./LaunchServer/build/libs/launcher-libraries-compile ./launcher-libraries-compile 10 | COPY ./compat/authlib/authlib-clean.jar ./LauncherAuthlib/build/libs/* ./ServerWrapper/build/libs/ServerWrapper.jar ./compat/ 11 | COPY ./modules/*_module/build/libs/* ./modules/*_lmodule/build/libs/* ./compat/modules/ 12 | CMD screen -DmS launchserver java -javaagent:LaunchServer.jar -jar LaunchServer.jar 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/Reconfigurable.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver; 2 | 3 | import pro.gravit.utils.command.Command; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | /** 9 | * Allows calling commands using the config command 10 | */ 11 | public interface Reconfigurable { 12 | /** 13 | * Gets a list of commands available for this object. 14 | * 15 | * @return Key - Command Name 16 | * Value is a command object 17 | */ 18 | Map getCommands(); 19 | 20 | default Map defaultCommandsMap() { 21 | return new HashMap<>(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/StarterAgent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver; 2 | 3 | import java.lang.instrument.Instrumentation; 4 | import java.nio.file.*; 5 | 6 | public final class StarterAgent { 7 | 8 | public static Instrumentation inst = null; 9 | public static Path libraries = null; 10 | private static boolean isStarted = false; 11 | 12 | public static boolean isAgentStarted() { 13 | return isStarted; 14 | } 15 | 16 | public static void premain(String agentArgument, Instrumentation inst) { 17 | throw new UnsupportedOperationException("Please remove -javaagent option from start.sh"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/Feature.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target({ElementType.TYPE}) 7 | @Repeatable(Features.class) 8 | public @interface Feature { 9 | String value(); 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/Features.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Features { 11 | Feature[] value(); 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/SQLSourceConfig.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | 6 | public interface SQLSourceConfig { 7 | Connection getConnection() throws SQLException; 8 | 9 | void close(); 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/PostgresSQLCoreProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.auth.AuthProviderPair; 5 | import pro.gravit.launchserver.auth.PostgreSQLSourceConfig; 6 | import pro.gravit.launchserver.auth.SQLSourceConfig; 7 | 8 | public class PostgresSQLCoreProvider extends AbstractSQLCoreProvider { 9 | public PostgreSQLSourceConfig postgresSQLHolder; 10 | 11 | @Override 12 | public SQLSourceConfig getSQLConfig() { 13 | return postgresSQLHolder; 14 | } 15 | 16 | @Override 17 | public void init(LaunchServer server, AuthProviderPair pair) { 18 | super.init(server, pair); 19 | logger.warn("Method 'postgresql' deprecated and may be removed in future release. Please use new 'sql' method: https://gravitlauncher.com/auth"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/User.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core; 2 | 3 | import pro.gravit.launcher.base.ClientPermissions; 4 | 5 | import java.util.UUID; 6 | 7 | public interface User { 8 | String getUsername(); 9 | 10 | UUID getUUID(); 11 | 12 | ClientPermissions getPermissions(); 13 | 14 | default boolean isBanned() { 15 | return false; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/UserSession.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core; 2 | 3 | public interface UserSession { 4 | String getID(); 5 | 6 | User getUser(); 7 | 8 | String getMinecraftAccessToken(); 9 | 10 | long getExpireIn(); 11 | } 12 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/UserHardware.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces; 2 | 3 | import pro.gravit.launcher.base.request.secure.HardwareReportRequest; 4 | 5 | public interface UserHardware { 6 | HardwareReportRequest.HardwareInfo getHardwareInfo(); 7 | 8 | byte[] getPublicKey(); 9 | 10 | String getId(); 11 | 12 | boolean isBanned(); 13 | } 14 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupport.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | public interface AuthSupport { 4 | } 5 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportAssetUpload.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launcher.base.events.request.AssetUploadInfoRequestEvent; 4 | import pro.gravit.launcher.base.events.request.AuthRequestEvent; 5 | import pro.gravit.launcher.base.events.request.GetAssetUploadUrlRequestEvent; 6 | import pro.gravit.launchserver.auth.Feature; 7 | import pro.gravit.launchserver.auth.core.User; 8 | 9 | import java.util.Set; 10 | 11 | @Feature(GetAssetUploadUrlRequestEvent.FEATURE_NAME) 12 | public interface AuthSupportAssetUpload extends AuthSupport { 13 | String getAssetUploadUrl(String name, User user); 14 | 15 | default AuthRequestEvent.OAuthRequestEvent getAssetUploadToken(String name, User user) { 16 | return null; 17 | } 18 | 19 | default AssetUploadInfoRequestEvent getAssetUploadInfo(User user) { 20 | return new AssetUploadInfoRequestEvent(Set.of("SKIN", "CAPE"), AssetUploadInfoRequestEvent.SlimSupportConf.USER); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportExit.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launchserver.auth.core.User; 4 | import pro.gravit.launchserver.auth.core.UserSession; 5 | 6 | public interface AuthSupportExit extends AuthSupport { 7 | void deleteSession(UserSession session); 8 | 9 | void exitUser(User user); 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportExtendedCheckServer.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launchserver.auth.core.UserSession; 4 | import pro.gravit.launchserver.socket.Client; 5 | 6 | import java.io.IOException; 7 | 8 | public interface AuthSupportExtendedCheckServer { 9 | UserSession extendedCheckServer(Client client, String username, String serverID); 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportGetAllUsers.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launchserver.auth.Feature; 4 | import pro.gravit.launchserver.auth.core.User; 5 | 6 | @Feature("users") 7 | public interface AuthSupportGetAllUsers extends AuthSupport { 8 | Iterable getAllUsers(); 9 | } 10 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportRegistration.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | import pro.gravit.launchserver.auth.Feature; 5 | import pro.gravit.launchserver.auth.core.User; 6 | 7 | import java.util.Map; 8 | 9 | @Feature("registration") 10 | public interface AuthSupportRegistration extends AuthSupport { 11 | User registration(String login, String email, AuthRequest.AuthPasswordInterface password, Map properties); 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/provider/AuthSupportSudo.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.provider; 2 | 3 | import pro.gravit.launchserver.auth.core.User; 4 | import pro.gravit.launchserver.manangers.AuthManager; 5 | 6 | import java.io.IOException; 7 | 8 | public interface AuthSupportSudo { 9 | AuthManager.AuthReport sudo(User user, boolean shadow) throws IOException; 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/session/UserSessionSupportHardware.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.session; 2 | 3 | import pro.gravit.launchserver.auth.core.interfaces.UserHardware; 4 | 5 | public interface UserSessionSupportHardware { 6 | String getHardwareId(); 7 | UserHardware getHardware(); 8 | } 9 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/session/UserSessionSupportKeys.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.session; 2 | 3 | import java.security.PrivateKey; 4 | import java.security.PublicKey; 5 | 6 | public interface UserSessionSupportKeys { 7 | ClientProfileKeys getClientProfileKeys(); 8 | 9 | record ClientProfileKeys(PublicKey publicKey, PrivateKey privateKey, byte[] signature /* V2 */, long expiresAt, 10 | long refreshedAfter) { 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/session/UserSessionSupportProperties.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.session; 2 | 3 | import java.util.Map; 4 | 5 | public interface UserSessionSupportProperties { 6 | Map getProperties(); 7 | } 8 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/user/UserSupportAdditionalData.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.user; 2 | 3 | import java.util.Map; 4 | 5 | public interface UserSupportAdditionalData { 6 | String getProperty(String name); 7 | 8 | default String getPropertyUnprivileged(String name) { 9 | return getProperty(name); 10 | } 11 | 12 | default String getPropertyUnprivilegedSelf(String name) { 13 | return getProperty(name); 14 | } 15 | 16 | Map getPropertiesMap(); 17 | 18 | default Map getPropertiesMapUnprivileged() { 19 | return getPropertiesMap(); 20 | } 21 | 22 | default Map getPropertiesMapUnprivilegedSelf() { 23 | return getPropertiesMapUnprivileged(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/user/UserSupportProperties.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.user; 2 | 3 | import java.util.Map; 4 | 5 | public interface UserSupportProperties { 6 | Map getProperties(); 7 | } 8 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/interfaces/user/UserSupportTextures.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.interfaces.user; 2 | 3 | import pro.gravit.launcher.base.profiles.ClientProfile; 4 | import pro.gravit.launcher.base.profiles.Texture; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public interface UserSupportTextures { 10 | Texture getSkinTexture(); 11 | 12 | Texture getCloakTexture(); 13 | 14 | default Texture getSkinTexture(ClientProfile profile) { 15 | return getSkinTexture(); 16 | } 17 | 18 | default Texture getCloakTexture(ClientProfile profile) { 19 | return getCloakTexture(); 20 | } 21 | 22 | default Map getUserAssets() { 23 | var skin = getSkinTexture(); 24 | var cape = getCloakTexture(); 25 | Map map = new HashMap<>(); 26 | if (skin != null) { 27 | map.put("SKIN", skin); 28 | } 29 | if (cape != null) { 30 | map.put("CAPE", cape); 31 | } 32 | return map; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/AccessTokenResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public record AccessTokenResponse(@SerializedName("access_token") String accessToken, 6 | @SerializedName("expires_in") Long expiresIn, 7 | @SerializedName("refresh_expires_in") Long refreshExpiresIn, 8 | @SerializedName("refresh_token") String refreshToken, 9 | @SerializedName("token_type") String tokenType, 10 | @SerializedName("id_token") String idToken, 11 | @SerializedName("not-before-policy") Integer notBeforePolicy, 12 | @SerializedName("session_state") String sessionState, 13 | @SerializedName("scope") String scope) { 14 | } 15 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/OpenIDConfig.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | import java.net.URI; 4 | 5 | public record OpenIDConfig(URI tokenUri, String authorizationEndpoint, String clientId, String clientSecret, 6 | String redirectUri, URI jwksUri, String scopes, String issuer, 7 | ClaimExtractorConfig extractorConfig) { 8 | 9 | public record ClaimExtractorConfig(String usernameClaim, String uuidClaim) {} 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/ServerSessionStore.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | import java.util.UUID; 4 | 5 | public interface ServerSessionStore { 6 | boolean joinServer(UUID uuid, String username, String serverId); 7 | String getServerIdByUsername(String username); 8 | } 9 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/TokenResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | public record TokenResponse(String accessToken, long accessTokenExpiresIn, 4 | String refreshToken, long refreshTokenExpiresIn) { 5 | } 6 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/UserEntity.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | import pro.gravit.launcher.base.ClientPermissions; 4 | import pro.gravit.launchserver.auth.core.User; 5 | 6 | import java.util.UUID; 7 | 8 | record UserEntity(String username, UUID uuid, ClientPermissions permissions) implements User { 9 | @Override 10 | public String getUsername() { 11 | return username; 12 | } 13 | 14 | @Override 15 | public UUID getUUID() { 16 | return uuid; 17 | } 18 | 19 | @Override 20 | public ClientPermissions getPermissions() { 21 | return permissions; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/core/openid/UserStore.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.core.openid; 2 | 3 | import pro.gravit.launchserver.auth.core.User; 4 | 5 | import java.util.UUID; 6 | 7 | public interface UserStore { 8 | User getByUsername(String username); 9 | 10 | User getUserByUUID(UUID uuid); 11 | 12 | void createOrUpdateUser(User user); 13 | } 14 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/mix/MixProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.mix; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.auth.core.AuthCoreProvider; 7 | import pro.gravit.utils.ProviderMap; 8 | 9 | public abstract class MixProvider implements AutoCloseable{ 10 | public static final ProviderMap providers = new ProviderMap<>("MixProvider"); 11 | private static final Logger logger = LogManager.getLogger(); 12 | private static boolean registredProviders = false; 13 | 14 | public static void registerProviders() { 15 | if (!registredProviders) { 16 | providers.register("uploadAsset", UploadAssetMixProvider.class); 17 | registredProviders = true; 18 | } 19 | } 20 | 21 | public abstract void init(LaunchServer server, AuthCoreProvider core); 22 | 23 | @SuppressWarnings("unchecked") 24 | public T isSupport(Class clazz) { 25 | if (clazz.isAssignableFrom(getClass())) return (T) this; 26 | return null; 27 | } 28 | 29 | @Override 30 | public abstract void close(); 31 | } 32 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/mix/UploadAssetMixProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.mix; 2 | 3 | import pro.gravit.launcher.base.events.request.AssetUploadInfoRequestEvent; 4 | import pro.gravit.launchserver.LaunchServer; 5 | import pro.gravit.launchserver.auth.core.AuthCoreProvider; 6 | import pro.gravit.launchserver.auth.core.User; 7 | import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportAssetUpload; 8 | 9 | import java.util.Map; 10 | 11 | public class UploadAssetMixProvider extends MixProvider implements AuthSupportAssetUpload { 12 | public Map urls; 13 | public AssetUploadInfoRequestEvent.SlimSupportConf slimSupportConf; 14 | 15 | @Override 16 | public String getAssetUploadUrl(String name, User user) { 17 | return urls.get(name); 18 | } 19 | 20 | @Override 21 | public AssetUploadInfoRequestEvent getAssetUploadInfo(User user) { 22 | return new AssetUploadInfoRequestEvent(urls.keySet(), slimSupportConf); 23 | } 24 | 25 | @Override 26 | public void init(LaunchServer server, AuthCoreProvider core) { 27 | 28 | } 29 | 30 | @Override 31 | public void close() { 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/AcceptPasswordVerifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.password; 2 | 3 | public class AcceptPasswordVerifier extends PasswordVerifier { 4 | @Override 5 | public boolean check(String encryptedPassword, String password) { 6 | return true; 7 | } 8 | 9 | @Override 10 | public String encrypt(String password) { 11 | return ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/BCryptPasswordVerifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.password; 2 | 3 | import org.bouncycastle.crypto.generators.OpenBSDBCrypt; 4 | import pro.gravit.utils.helper.SecurityHelper; 5 | 6 | public class BCryptPasswordVerifier extends PasswordVerifier { 7 | public int cost = 10; 8 | 9 | @Override 10 | public boolean check(String encryptedPassword, String password) { 11 | return OpenBSDBCrypt.checkPassword(encryptedPassword, password.toCharArray()); 12 | } 13 | 14 | @Override 15 | public String encrypt(String password) { 16 | return OpenBSDBCrypt.generate(password.toCharArray(), SecurityHelper.randomBytes(16), cost); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/PasswordVerifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.password; 2 | 3 | import pro.gravit.utils.ProviderMap; 4 | 5 | public abstract class PasswordVerifier { 6 | public static final ProviderMap providers = new ProviderMap<>("PasswordVerifier"); 7 | private static boolean registeredProviders = false; 8 | 9 | public static void registerProviders() { 10 | if (!registeredProviders) { 11 | providers.register("plain", PlainPasswordVerifier.class); 12 | providers.register("digest", DigestPasswordVerifier.class); 13 | providers.register("doubleDigest", DoubleDigestPasswordVerifier.class); 14 | providers.register("json", JsonPasswordVerifier.class); 15 | providers.register("bcrypt", BCryptPasswordVerifier.class); 16 | providers.register("accept", AcceptPasswordVerifier.class); 17 | providers.register("reject", RejectPasswordVerifier.class); 18 | registeredProviders = true; 19 | } 20 | } 21 | 22 | public abstract boolean check(String encryptedPassword, String password); 23 | 24 | public String encrypt(String password) { 25 | throw new UnsupportedOperationException(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/PlainPasswordVerifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.password; 2 | 3 | public class PlainPasswordVerifier extends PasswordVerifier { 4 | @Override 5 | public boolean check(String encryptedPassword, String password) { 6 | return encryptedPassword.equals(password); 7 | } 8 | 9 | @Override 10 | public String encrypt(String password) { 11 | return super.encrypt(password); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/RejectPasswordVerifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.password; 2 | 3 | public class RejectPasswordVerifier extends PasswordVerifier { 4 | @Override 5 | public boolean check(String encryptedPassword, String password) { 6 | return false; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/NoProtectHandler.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.protect; 2 | 3 | import pro.gravit.launchserver.socket.Client; 4 | import pro.gravit.launchserver.socket.response.auth.AuthResponse; 5 | 6 | public class NoProtectHandler extends ProtectHandler { 7 | 8 | @Override 9 | public boolean allowGetAccessToken(AuthResponse.AuthContext context) { 10 | return true; 11 | } 12 | 13 | @Override 14 | public boolean allowJoinServer(Client client) { 15 | return true; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/ProtectHandler.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.protect; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.socket.Client; 5 | import pro.gravit.launchserver.socket.response.auth.AuthResponse; 6 | import pro.gravit.utils.ProviderMap; 7 | 8 | public abstract class ProtectHandler { 9 | public static final ProviderMap providers = new ProviderMap<>("ProtectHandler"); 10 | private static boolean registredHandl = false; 11 | 12 | 13 | public static void registerHandlers() { 14 | if (!registredHandl) { 15 | providers.register("none", NoProtectHandler.class); 16 | providers.register("std", StdProtectHandler.class); 17 | providers.register("advanced", AdvancedProtectHandler.class); 18 | registredHandl = true; 19 | } 20 | } 21 | 22 | public abstract boolean allowGetAccessToken(AuthResponse.AuthContext context); 23 | public boolean allowJoinServer(Client client) { 24 | return client.isAuth && client.type == AuthResponse.ConnectTypes.CLIENT; 25 | } 26 | 27 | public void init(LaunchServer server) { 28 | 29 | } 30 | 31 | public void close() { 32 | 33 | } 34 | //public abstract 35 | } 36 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/interfaces/HardwareProtectHandler.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.protect.interfaces; 2 | 3 | import pro.gravit.launchserver.socket.Client; 4 | import pro.gravit.launchserver.socket.response.secure.HardwareReportResponse; 5 | 6 | public interface HardwareProtectHandler { 7 | void onHardwareReport(HardwareReportResponse response, Client client); 8 | } 9 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/interfaces/JoinServerProtectHandler.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.protect.interfaces; 2 | 3 | import pro.gravit.launchserver.socket.Client; 4 | 5 | import java.util.UUID; 6 | 7 | public interface JoinServerProtectHandler { 8 | default boolean onJoinServer(String serverID, String username, UUID uuid, Client client) { 9 | return true; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/protect/interfaces/ProfilesProtectHandler.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.protect.interfaces; 2 | 3 | import pro.gravit.launcher.base.profiles.ClientProfile; 4 | import pro.gravit.launchserver.socket.Client; 5 | 6 | public interface ProfilesProtectHandler { 7 | default boolean canGetProfiles(Client client) { 8 | return true; 9 | } 10 | 11 | default boolean canGetProfile(ClientProfile profile, Client client) { 12 | return true; 13 | } 14 | 15 | default boolean canChangeProfile(ClientProfile profile, Client client) { 16 | return client.isAuth; 17 | } 18 | 19 | default boolean canGetUpdates(String updatesDirName, Client client) { 20 | return true; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/texture/NullTextureProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.texture; 2 | 3 | import pro.gravit.launcher.base.profiles.Texture; 4 | import pro.gravit.utils.helper.VerifyHelper; 5 | 6 | import java.io.IOException; 7 | import java.util.Objects; 8 | import java.util.UUID; 9 | 10 | public final class NullTextureProvider extends TextureProvider { 11 | private volatile TextureProvider provider; 12 | 13 | @Override 14 | public void close() throws IOException { 15 | TextureProvider provider = this.provider; 16 | if (provider != null) 17 | provider.close(); 18 | } 19 | 20 | @Override 21 | public Texture getCloakTexture(UUID uuid, String username, String client) throws IOException { 22 | return getProvider().getCloakTexture(uuid, username, client); 23 | } 24 | 25 | private TextureProvider getProvider() { 26 | return VerifyHelper.verify(provider, Objects::nonNull, "Backend texture provider wasn't set"); 27 | } 28 | 29 | @Override 30 | public Texture getSkinTexture(UUID uuid, String username, String client) throws IOException { 31 | return getProvider().getSkinTexture(uuid, username, client); 32 | } 33 | 34 | 35 | public void setBackend(TextureProvider provider) { 36 | this.provider = provider; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/auth/texture/VoidTextureProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.auth.texture; 2 | 3 | import pro.gravit.launcher.base.profiles.Texture; 4 | 5 | import java.util.UUID; 6 | 7 | public final class VoidTextureProvider extends TextureProvider { 8 | 9 | @Override 10 | public void close() { 11 | // Do nothing 12 | } 13 | 14 | @Override 15 | public Texture getCloakTexture(UUID uuid, String username, String client) { 16 | return null; // Always nothing 17 | } 18 | 19 | @Override 20 | public Texture getSkinTexture(UUID uuid, String username, String client) { 21 | return null; // Always nothing 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/binary/EXELauncherBinary.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.binary; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.utils.helper.IOHelper; 5 | 6 | import java.io.IOException; 7 | import java.nio.file.Files; 8 | 9 | public class EXELauncherBinary extends LauncherBinary { 10 | 11 | public EXELauncherBinary(LaunchServer server) { 12 | super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s.exe"); 13 | } 14 | 15 | @Override 16 | public void build() throws IOException { 17 | if (IOHelper.isFile(syncBinaryFile)) { 18 | Files.delete(syncBinaryFile); 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/LauncherBuildTask.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.binary.tasks; 2 | 3 | import java.io.IOException; 4 | import java.nio.file.Path; 5 | 6 | public interface LauncherBuildTask { 7 | String getName(); 8 | 9 | Path process(Path inputFile) throws IOException; 10 | } 11 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/binary/tasks/exe/BuildExeMainTask.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.binary.tasks.exe; 2 | 3 | public interface BuildExeMainTask { 4 | } 5 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/BuildCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.basic; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | public final class BuildCommand extends Command { 7 | public BuildCommand(LaunchServer server) { 8 | super(server); 9 | } 10 | 11 | @Override 12 | public String getArgsDescription() { 13 | return null; 14 | } 15 | 16 | @Override 17 | public String getUsageDescription() { 18 | return "Build launcher binaries"; 19 | } 20 | 21 | @Override 22 | public void invoke(String... args) throws Exception { 23 | server.buildLauncherBinaries(); 24 | server.syncLauncherBinaries(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/StopCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.basic; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | import pro.gravit.utils.helper.JVMHelper; 6 | 7 | public final class StopCommand extends Command { 8 | public StopCommand(LaunchServer server) { 9 | super(server); 10 | } 11 | 12 | @Override 13 | public String getArgsDescription() { 14 | return null; 15 | } 16 | 17 | @Override 18 | public String getUsageDescription() { 19 | return "Stop LaunchServer"; 20 | } 21 | 22 | @Override 23 | public void invoke(String... args) { 24 | JVMHelper.RUNTIME.exit(0); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/VersionCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.basic; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | import pro.gravit.utils.Version; 8 | import pro.gravit.utils.helper.JVMHelper; 9 | 10 | import java.lang.management.RuntimeMXBean; 11 | 12 | public final class VersionCommand extends Command { 13 | private transient final Logger logger = LogManager.getLogger(); 14 | 15 | public VersionCommand(LaunchServer server) { 16 | super(server); 17 | } 18 | 19 | @Override 20 | public String getArgsDescription() { 21 | return null; 22 | } 23 | 24 | @Override 25 | public String getUsageDescription() { 26 | return "Print LaunchServer version"; 27 | } 28 | 29 | @Override 30 | public void invoke(String... args) { 31 | logger.info("LaunchServer version: {}.{}.{} (build #{})", Version.MAJOR, Version.MINOR, Version.PATCH, Version.BUILD); 32 | RuntimeMXBean mxBean = JVMHelper.RUNTIME_MXBEAN; 33 | logger.info("Java {}({})", JVMHelper.getVersion(), mxBean.getVmVersion()); 34 | logger.info("Java Home: {}", System.getProperty("java.home", "UNKNOWN")); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/modules/LoadModuleCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.modules; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | import java.nio.file.Path; 7 | import java.nio.file.Paths; 8 | 9 | public class LoadModuleCommand extends Command { 10 | public LoadModuleCommand(LaunchServer server) { 11 | super(server); 12 | } 13 | 14 | @Override 15 | public String getArgsDescription() { 16 | return "[jar]"; 17 | } 18 | 19 | @Override 20 | public String getUsageDescription() { 21 | return "Module jar file"; 22 | } 23 | 24 | @Override 25 | public void invoke(String... args) throws Exception { 26 | verifyArgs(args, 1); 27 | Path file = Paths.get(args[0]); 28 | server.modulesManager.loadModule(file); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/profiles/ListProfilesCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.profiles; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | 8 | public class ListProfilesCommand extends Command { 9 | private final transient Logger logger = LogManager.getLogger(ListProfilesCommand.class); 10 | public ListProfilesCommand(LaunchServer server) { 11 | super(server); 12 | } 13 | 14 | @Override 15 | public String getArgsDescription() { 16 | return null; 17 | } 18 | 19 | @Override 20 | public String getUsageDescription() { 21 | return "show all profiles"; 22 | } 23 | 24 | @Override 25 | public void invoke(String... args) { 26 | for(var profile : server.getProfiles()) { 27 | logger.info("{} ({}) {}", profile.getTitle(), profile.getVersion().toString(), profile.isLimited() ? "limited" : ""); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/profiles/ProfilesCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.profiles; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | public class ProfilesCommand extends Command { 7 | public ProfilesCommand(LaunchServer server) { 8 | super(server); 9 | this.childCommands.put("make", new MakeProfileCommand(server)); 10 | this.childCommands.put("save", new SaveProfilesCommand(server)); 11 | this.childCommands.put("clone", new CloneProfileCommand(server)); 12 | this.childCommands.put("list", new ListProfilesCommand(server)); 13 | this.childCommands.put("delete", new DeleteProfileCommand(server)); 14 | } 15 | 16 | @Override 17 | public String getArgsDescription() { 18 | return "[subcommand] [args...]"; 19 | } 20 | 21 | @Override 22 | public String getUsageDescription() { 23 | return "manage profiles"; 24 | } 25 | 26 | @Override 27 | public void invoke(String... args) throws Exception { 28 | invokeSubcommands(args); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/service/ConfigCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.service; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | public class ConfigCommand extends Command { 7 | public ConfigCommand(LaunchServer server) { 8 | super(server.reconfigurableManager.getCommands(), server); 9 | } 10 | 11 | @Override 12 | public String getArgsDescription() { 13 | return "[name] [action] [more args]"; 14 | } 15 | 16 | @Override 17 | public String getUsageDescription() { 18 | return "call reconfigurable action"; 19 | } 20 | 21 | @Override 22 | public void invoke(String... args) throws Exception { 23 | invokeSubcommands(args); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncBinariesCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | 8 | import java.io.IOException; 9 | 10 | public final class SyncBinariesCommand extends Command { 11 | private transient final Logger logger = LogManager.getLogger(); 12 | 13 | public SyncBinariesCommand(LaunchServer server) { 14 | super(server); 15 | } 16 | 17 | @Override 18 | public String getArgsDescription() { 19 | return null; 20 | } 21 | 22 | @Override 23 | public String getUsageDescription() { 24 | return "Resync launcher binaries"; 25 | } 26 | 27 | @Override 28 | public void invoke(String... args) throws IOException { 29 | server.syncLauncherBinaries(); 30 | logger.info("Binaries successfully resynced"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | public class SyncCommand extends Command { 7 | public SyncCommand(LaunchServer server) { 8 | super(server); 9 | this.childCommands.put("profiles", new SyncProfilesCommand(server)); 10 | this.childCommands.put("binaries", new SyncBinariesCommand(server)); 11 | this.childCommands.put("updates", new SyncUpdatesCommand(server)); 12 | this.childCommands.put("up", new SyncUPCommand(server)); 13 | this.childCommands.put("launchermodules", new SyncLauncherModulesCommand(server)); 14 | this.childCommands.put("updatescache", new SyncUpdatesCacheCommand(server)); 15 | } 16 | 17 | @Override 18 | public String getArgsDescription() { 19 | return "[updates/profiles/up/binaries/launchermodules/updatescache] [args...]"; 20 | } 21 | 22 | @Override 23 | public String getUsageDescription() { 24 | return "sync specified objects"; 25 | } 26 | 27 | @Override 28 | public void invoke(String... args) throws Exception { 29 | invokeSubcommands(args); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncLauncherModulesCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | 8 | public class SyncLauncherModulesCommand extends Command { 9 | private transient final Logger logger = LogManager.getLogger(); 10 | 11 | public SyncLauncherModulesCommand(LaunchServer server) { 12 | super(server); 13 | } 14 | 15 | 16 | @Override 17 | public String getArgsDescription() { 18 | return null; 19 | } 20 | 21 | @Override 22 | public String getUsageDescription() { 23 | return "Resync launcher modules"; 24 | } 25 | 26 | @Override 27 | public void invoke(String... args) throws Exception { 28 | server.launcherModuleLoader.syncModules(); 29 | logger.info("Launcher Modules synced"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncProfilesCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | 8 | import java.io.IOException; 9 | 10 | public final class SyncProfilesCommand extends Command { 11 | private transient final Logger logger = LogManager.getLogger(); 12 | 13 | public SyncProfilesCommand(LaunchServer server) { 14 | super(server); 15 | } 16 | 17 | @Override 18 | public String getArgsDescription() { 19 | return null; 20 | } 21 | 22 | @Override 23 | public String getUsageDescription() { 24 | return "Resync profiles dir"; 25 | } 26 | 27 | @Override 28 | public void invoke(String... args) throws IOException { 29 | server.syncProfilesDir(); 30 | logger.info("Profiles successfully resynced"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncUPCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.command.Command; 7 | 8 | import java.io.IOException; 9 | 10 | public final class SyncUPCommand extends Command { 11 | private transient final Logger logger = LogManager.getLogger(); 12 | 13 | public SyncUPCommand(LaunchServer server) { 14 | super(server); 15 | } 16 | 17 | @Override 18 | public String getArgsDescription() { 19 | return null; 20 | } 21 | 22 | @Override 23 | public String getUsageDescription() { 24 | return "Resync profiles & updates dirs"; 25 | } 26 | 27 | @Override 28 | public void invoke(String... args) throws IOException { 29 | server.syncProfilesDir(); 30 | logger.info("Profiles successfully resynced"); 31 | 32 | server.syncUpdatesDir(null); 33 | logger.info("Updates dir successfully resynced"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/command/sync/SyncUpdatesCacheCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.command.sync; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.command.Command; 5 | 6 | public class SyncUpdatesCacheCommand extends Command { 7 | public SyncUpdatesCacheCommand(LaunchServer server) { 8 | super(server); 9 | } 10 | 11 | @Override 12 | public String getArgsDescription() { 13 | return null; 14 | } 15 | 16 | @Override 17 | public String getUsageDescription() { 18 | return "sync updates cache"; 19 | } 20 | 21 | @Override 22 | public void invoke(String... args) throws Exception { 23 | server.updatesManager.readUpdatesFromCache(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/components/AuthLimiterComponent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.components; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.socket.Client; 5 | import pro.gravit.launchserver.socket.response.auth.AuthResponse; 6 | import pro.gravit.utils.HookException; 7 | 8 | public class AuthLimiterComponent extends IPLimiter implements AutoCloseable { 9 | public String message; 10 | private transient LaunchServer srv; 11 | 12 | @Override 13 | public void init(LaunchServer launchServer) { 14 | srv = launchServer; 15 | launchServer.authHookManager.preHook.registerHook(this::preAuthHook); 16 | } 17 | 18 | public boolean preAuthHook(AuthResponse.AuthContext context, Client client) { 19 | if (!check(context.ip)) { 20 | throw new HookException(message); 21 | } 22 | return false; 23 | } 24 | 25 | @Override 26 | public void close() { 27 | srv.authHookManager.preHook.unregisterHook(this::preAuthHook); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/components/CommandRemoverComponent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.components; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.utils.command.Command; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public class CommandRemoverComponent extends Component implements AutoCloseable { 10 | public final String[] removeList = new String[]{}; 11 | public final transient Map commandsList = new HashMap<>(); 12 | private transient LaunchServer server = null; 13 | 14 | @Override 15 | public void init(LaunchServer launchServer) { 16 | server = launchServer; 17 | for (String cmd : removeList) { 18 | Command removedCmd = launchServer.commandHandler.unregisterCommand(cmd); 19 | if (removedCmd != null) 20 | commandsList.put(cmd, removedCmd); 21 | } 22 | } 23 | 24 | @Override 25 | public void close() { 26 | for (Map.Entry e : commandsList.entrySet()) { 27 | server.commandHandler.registerCommand(e.getKey(), e.getValue()); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/components/Component.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.components; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.utils.ProviderMap; 5 | 6 | public abstract class Component { 7 | public static final ProviderMap providers = new ProviderMap<>(); 8 | private static boolean registredComp = false; 9 | protected transient String componentName; 10 | 11 | public static void registerComponents() { 12 | if (!registredComp) { 13 | providers.register("authLimiter", AuthLimiterComponent.class); 14 | providers.register("commandRemover", CommandRemoverComponent.class); 15 | providers.register("proguard", ProGuardComponent.class); 16 | providers.register("whitelist", WhitelistComponent.class); 17 | registredComp = true; 18 | } 19 | } 20 | 21 | public abstract void init(LaunchServer launchServer); 22 | 23 | public final void setComponentName(String s) { 24 | this.componentName = s; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/components/IPLimiter.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.components; 2 | 3 | public abstract class IPLimiter extends AbstractLimiter { 4 | @Override 5 | protected String getFromString(String str) { 6 | return str; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerRuntimeConfig.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.config; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import pro.gravit.utils.helper.SecurityHelper; 6 | 7 | public class LaunchServerRuntimeConfig { 8 | private transient final Logger logger = LogManager.getLogger(); 9 | public String passwordEncryptKey; 10 | public String runtimeEncryptKey; 11 | public String unlockSecret; 12 | public String registerApiKey; 13 | public String clientCheckSecret; 14 | public long buildNumber; 15 | 16 | public void verify() { 17 | if (passwordEncryptKey == null) logger.error("[RuntimeConfig] passwordEncryptKey must not be null"); 18 | if (clientCheckSecret == null) { 19 | logger.warn("[RuntimeConfig] clientCheckSecret must not be null"); 20 | clientCheckSecret = SecurityHelper.randomStringToken(); 21 | } 22 | } 23 | 24 | public void reset() { 25 | passwordEncryptKey = SecurityHelper.randomStringToken(); 26 | runtimeEncryptKey = SecurityHelper.randomStringAESKey(); 27 | registerApiKey = SecurityHelper.randomStringToken(); 28 | clientCheckSecret = SecurityHelper.randomStringToken(); 29 | buildNumber = 0; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/holder/LaunchServerControlHolder.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.holder; 2 | 3 | import pro.gravit.utils.launch.ClassLoaderControl; 4 | 5 | public class LaunchServerControlHolder { 6 | private static ClassLoaderControl control; 7 | private static ModuleLayer.Controller controller; 8 | 9 | public static ClassLoaderControl getControl() { 10 | return control; 11 | } 12 | 13 | public static void setControl(ClassLoaderControl control) { 14 | LaunchServerControlHolder.control = control; 15 | } 16 | 17 | public static ModuleLayer.Controller getController() { 18 | return controller; 19 | } 20 | 21 | public static void setController(ModuleLayer.Controller controller) { 22 | LaunchServerControlHolder.controller = controller; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/launchermodules/LauncherModuleClassLoader.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.launchermodules; 2 | 3 | import java.net.URL; 4 | import java.net.URLClassLoader; 5 | 6 | public class LauncherModuleClassLoader extends URLClassLoader { 7 | public LauncherModuleClassLoader(ClassLoader parent) { 8 | super(new URL[0], parent); 9 | } 10 | 11 | public void addURL(URL u) { 12 | super.addURL(u); 13 | } 14 | 15 | public Class rawDefineClass(String name, byte[] bytes) { 16 | return defineClass(name, bytes, 0, bytes.length); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/manangers/FeaturesManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.manangers; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.utils.Version; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public class FeaturesManager { 10 | private final Map map; 11 | 12 | public FeaturesManager(LaunchServer server) { 13 | map = new HashMap<>(); 14 | addFeatureInfo("version", Version.getVersion().getVersionString()); 15 | addFeatureInfo("projectName", server.config.projectName); 16 | } 17 | 18 | public Map getMap() { 19 | return map; 20 | } 21 | 22 | public String getFeatureInfo(String name) { 23 | return map.get(name); 24 | } 25 | 26 | public void addFeatureInfo(String name, String featureInfo) { 27 | map.put(name, featureInfo); 28 | } 29 | 30 | public String removeFeatureInfo(String name) { 31 | return map.remove(name); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/manangers/UpdatesManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.manangers; 2 | 3 | import pro.gravit.launcher.core.hasher.HashedDir; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | import java.io.IOException; 7 | import java.util.*; 8 | 9 | public class UpdatesManager { 10 | private final LaunchServer server; 11 | 12 | public UpdatesManager(LaunchServer server) { 13 | this.server = server; 14 | } 15 | 16 | @Deprecated 17 | public void readUpdatesFromCache() { 18 | 19 | } 20 | 21 | @Deprecated 22 | public void readUpdatesDir() { 23 | 24 | } 25 | 26 | @Deprecated 27 | public void syncUpdatesDir(Collection dirs) throws IOException { 28 | server.config.updatesProvider.sync(dirs); 29 | } 30 | 31 | @Deprecated 32 | public HashSet getUpdatesList() { 33 | return new HashSet<>(); 34 | } 35 | 36 | @Deprecated 37 | public HashedDir getUpdate(String name) { 38 | return server.config.updatesProvider.getUpdatesDir(name); 39 | } 40 | 41 | @Deprecated 42 | public void addUpdate(String name, HashedDir dir) { 43 | throw new UnsupportedOperationException(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/manangers/hook/AuthHookManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.manangers.hook; 2 | 3 | import pro.gravit.launchserver.manangers.AuthManager; 4 | import pro.gravit.launchserver.socket.Client; 5 | import pro.gravit.launchserver.socket.response.auth.AuthResponse; 6 | import pro.gravit.launchserver.socket.response.auth.CheckServerResponse; 7 | import pro.gravit.launchserver.socket.response.auth.JoinServerResponse; 8 | import pro.gravit.launchserver.socket.response.auth.SetProfileResponse; 9 | import pro.gravit.utils.BiHookSet; 10 | 11 | public class AuthHookManager { 12 | public final BiHookSet preHook = new BiHookSet<>(); 13 | public final BiHookSet postHook = new BiHookSet<>(); 14 | public final BiHookSet checkServerHook = new BiHookSet<>(); 15 | public final BiHookSet postCheckServerHook = new BiHookSet<>(); 16 | public final BiHookSet joinServerHook = new BiHookSet<>(); 17 | public final BiHookSet setProfileHook = new BiHookSet<>(); 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerFullInitEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerFullInitEvent extends LauncherModule.Event { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerFullInitEvent(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerInitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.events.InitPhase; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerInitPhase extends InitPhase { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerInitPhase(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerLauncherExeInit.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | import pro.gravit.launchserver.binary.LauncherBinary; 6 | 7 | public class LaunchServerLauncherExeInit extends LauncherModule.Event { 8 | public final LaunchServer server; 9 | public LauncherBinary binary; 10 | 11 | public LaunchServerLauncherExeInit(LaunchServer server, LauncherBinary binary) { 12 | this.server = server; 13 | this.binary = binary; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerNettyFullInitEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerNettyFullInitEvent extends LauncherModule.Event { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerNettyFullInitEvent(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerPostInitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.events.PostInitPhase; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerPostInitPhase extends PostInitPhase { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerPostInitPhase(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerProfilesSyncEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerProfilesSyncEvent extends LauncherModule.Event { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerProfilesSyncEvent(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/LaunchServerUpdatesSyncEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerUpdatesSyncEvent extends LauncherModule.Event { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerUpdatesSyncEvent(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/NewLaunchServerInstanceEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class NewLaunchServerInstanceEvent extends LauncherModule.Event { 7 | public final LaunchServer launchServer; 8 | 9 | public NewLaunchServerInstanceEvent(LaunchServer launchServer) { 10 | this.launchServer = launchServer; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/events/security/SecurityReportModuleEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.events.security; 2 | 3 | import pro.gravit.launcher.base.events.request.SecurityReportRequestEvent; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launchserver.socket.Client; 6 | import pro.gravit.launchserver.socket.response.secure.SecurityReportResponse; 7 | 8 | public class SecurityReportModuleEvent extends LauncherModule.Event { 9 | public final SecurityReportRequestEvent event; 10 | public final SecurityReportResponse response; 11 | public final Client client; 12 | 13 | public SecurityReportModuleEvent(SecurityReportRequestEvent event, SecurityReportResponse response, Client client) { 14 | this.event = event; 15 | this.response = response; 16 | this.client = client; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/impl/LaunchServerCoreModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.launcher.base.modules.events.InitPhase; 7 | import pro.gravit.utils.Version; 8 | 9 | public class LaunchServerCoreModule extends LauncherModule { 10 | public LaunchServerCoreModule() { 11 | super(new LauncherModuleInfo("LaunchServerCore", Version.getVersion())); 12 | } 13 | 14 | @Override 15 | public void init(LauncherInitContext initContext) { 16 | registerEvent(this::testEvent, InitPhase.class); 17 | } 18 | 19 | public void testEvent(InitPhase event) { 20 | //LogHelper.debug("[LaunchServerCore] Event LaunchServerInitPhase passed"); 21 | } 22 | 23 | @Override 24 | public boolean registerEvent(EventHandler handle, Class tClass) { 25 | return super.registerEvent(handle, tClass); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/modules/impl/LaunchServerInitContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.modules.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launchserver.LaunchServer; 5 | 6 | public class LaunchServerInitContext implements LauncherInitContext { 7 | public final LaunchServer server; 8 | 9 | public LaunchServerInitContext(LaunchServer server) { 10 | this.server = server; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyConnectContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket; 2 | 3 | public class NettyConnectContext { 4 | public String ip = null; 5 | } 6 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyThreadFactory.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket; 2 | 3 | import io.netty.util.concurrent.DefaultThreadFactory; 4 | import org.apache.logging.log4j.LogManager; 5 | import org.apache.logging.log4j.Logger; 6 | 7 | public class NettyThreadFactory extends DefaultThreadFactory { 8 | private transient final Logger logger = LogManager.getLogger(); 9 | 10 | public NettyThreadFactory(String poolName) { 11 | super(poolName); 12 | } 13 | 14 | @Override 15 | protected Thread newThread(Runnable r, String name) { 16 | Thread thread = super.newThread(r, name); 17 | thread.setUncaughtExceptionHandler((th, e) -> { 18 | if (e.getMessage().contains("Connection reset by peer")) { 19 | return; 20 | } 21 | logger.error("Netty exception", e); 22 | }); 23 | return thread; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/ContentType.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.handlers; 2 | 3 | import java.io.File; 4 | import java.nio.file.Files; 5 | 6 | public enum ContentType { 7 | NONE { 8 | @Override 9 | public String forPath(File p) { 10 | return null; 11 | } 12 | 13 | }, 14 | NIO { 15 | @Override 16 | public String forPath(File p) { 17 | try { 18 | return Files.probeContentType(p.toPath()); 19 | } catch (Throwable e) { 20 | return UNIVERSAL.forPath(p); 21 | } 22 | } 23 | }, 24 | UNIVERSAL { 25 | @Override 26 | public String forPath(File p) { 27 | return "application/octet-stream"; 28 | } 29 | 30 | }; 31 | 32 | public abstract String forPath(File p); 33 | } 34 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/fileserver/ClosingChannelFutureListener.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.handlers.fileserver; 2 | 3 | import io.netty.channel.ChannelFuture; 4 | import io.netty.channel.ChannelFutureListener; 5 | import pro.gravit.utils.helper.IOHelper; 6 | 7 | import java.io.Closeable; 8 | 9 | public class ClosingChannelFutureListener implements ChannelFutureListener { 10 | public final Closeable[] close; 11 | 12 | public ClosingChannelFutureListener(Closeable... close) { 13 | this.close = close; 14 | } 15 | 16 | 17 | @Override 18 | public void operationComplete(ChannelFuture future) { 19 | for (Closeable cl : close) IOHelper.close(cl); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/UnknownResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launchserver.socket.Client; 5 | 6 | public class UnknownResponse extends SimpleResponse { 7 | @Override 8 | public String getType() { 9 | return "unknown"; 10 | } 11 | 12 | @Override 13 | public void execute(ChannelHandlerContext ctx, Client client) { 14 | sendError("This type of request is not supported"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/WebSocketServerResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 5 | import pro.gravit.launchserver.socket.Client; 6 | 7 | public interface WebSocketServerResponse extends WebSocketRequest { 8 | String getType(); 9 | 10 | void execute(ChannelHandlerContext ctx, Client client); 11 | 12 | default ThreadSafeStatus getThreadSafeStatus() { 13 | return ThreadSafeStatus.READ; 14 | } 15 | 16 | enum ThreadSafeStatus { 17 | NONE, READ, READ_WRITE 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/CurrentUserResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.auth; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.CurrentUserRequestEvent; 5 | import pro.gravit.launchserver.LaunchServer; 6 | import pro.gravit.launchserver.socket.Client; 7 | import pro.gravit.launchserver.socket.response.SimpleResponse; 8 | 9 | public class CurrentUserResponse extends SimpleResponse { 10 | 11 | public static CurrentUserRequestEvent.UserInfo collectUserInfoFromClient(LaunchServer server, Client client) { 12 | CurrentUserRequestEvent.UserInfo result = new CurrentUserRequestEvent.UserInfo(); 13 | if (client.auth != null && client.isAuth && client.username != null) { 14 | result.playerProfile = server.authManager.getPlayerProfile(client); 15 | } 16 | result.permissions = client.permissions; 17 | return result; 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "currentUser"; 23 | } 24 | 25 | @Override 26 | public void execute(ChannelHandlerContext ctx, Client client) { 27 | sendResult(new CurrentUserRequestEvent(collectUserInfoFromClient(server, client))); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/auth/GetAvailabilityAuthResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.auth; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent; 5 | import pro.gravit.launchserver.auth.AuthProviderPair; 6 | import pro.gravit.launchserver.socket.Client; 7 | import pro.gravit.launchserver.socket.response.SimpleResponse; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class GetAvailabilityAuthResponse extends SimpleResponse { 13 | @Override 14 | public String getType() { 15 | return "getAvailabilityAuth"; 16 | } 17 | 18 | @Override 19 | public void execute(ChannelHandlerContext ctx, Client client) { 20 | List list = new ArrayList<>(); 21 | for (AuthProviderPair pair : server.config.auth.values()) { 22 | list.add(new GetAvailabilityAuthRequestEvent.AuthAvailability(pair.core.getDetails(client), pair.name, pair.displayName, 23 | pair.visible, pair.getFeatures())); 24 | } 25 | sendResult(new GetAvailabilityAuthRequestEvent(list)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/cabinet/AssetUploadInfoResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.cabinet; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportAssetUpload; 5 | import pro.gravit.launchserver.socket.Client; 6 | import pro.gravit.launchserver.socket.response.SimpleResponse; 7 | 8 | public class AssetUploadInfoResponse extends SimpleResponse { 9 | @Override 10 | public String getType() { 11 | return "assetUploadInfo"; 12 | } 13 | 14 | @Override 15 | public void execute(ChannelHandlerContext ctx, Client client) { 16 | if(!client.isAuth || client.auth == null || client.getUser() == null) { 17 | sendError("Access denied"); 18 | return; 19 | } 20 | var support = client.auth.isSupport(AuthSupportAssetUpload.class); 21 | if(support == null) { 22 | sendError("Not supported"); 23 | return; 24 | } 25 | sendResult(support.getAssetUploadInfo(client.getUser())); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/cabinet/GetAssetUploadInfoResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.cabinet; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.GetAssetUploadUrlRequestEvent; 5 | import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportAssetUpload; 6 | import pro.gravit.launchserver.socket.Client; 7 | import pro.gravit.launchserver.socket.response.SimpleResponse; 8 | 9 | public class GetAssetUploadInfoResponse extends SimpleResponse { 10 | public String name; 11 | @Override 12 | public String getType() { 13 | return "getAssetUploadUrl"; 14 | } 15 | 16 | @Override 17 | public void execute(ChannelHandlerContext ctx, Client client) { 18 | if(!client.isAuth || client.auth == null || client.getUser() == null) { 19 | sendError("Access denied"); 20 | return; 21 | } 22 | var support = client.auth.isSupport(AuthSupportAssetUpload.class); 23 | if(support == null) { 24 | sendError("Not supported"); 25 | return; 26 | } 27 | sendResult(new GetAssetUploadUrlRequestEvent(support.getAssetUploadUrl(name, client.getUser()), support.getAssetUploadToken(name, client.getUser()))); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/management/FeaturesResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.management; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.FeaturesRequestEvent; 5 | import pro.gravit.launchserver.socket.Client; 6 | import pro.gravit.launchserver.socket.response.SimpleResponse; 7 | 8 | public class FeaturesResponse extends SimpleResponse { 9 | @Override 10 | public String getType() { 11 | return "features"; 12 | } 13 | 14 | @Override 15 | public void execute(ChannelHandlerContext ctx, Client client) { 16 | sendResult(new FeaturesRequestEvent(server.featuresManager.getMap())); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/management/GetConnectUUIDResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.management; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.GetConnectUUIDRequestEvent; 5 | import pro.gravit.launchserver.socket.Client; 6 | import pro.gravit.launchserver.socket.response.SimpleResponse; 7 | 8 | public class GetConnectUUIDResponse extends SimpleResponse { 9 | @Override 10 | public String getType() { 11 | return "getConnectUUID"; 12 | } 13 | 14 | @Override 15 | public void execute(ChannelHandlerContext ctx, Client client) { 16 | sendResult(new GetConnectUUIDRequestEvent(connectUUID, server.shardId)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/management/GetPublicKeyResponse.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.management; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.GetPublicKeyRequestEvent; 5 | import pro.gravit.launchserver.socket.Client; 6 | import pro.gravit.launchserver.socket.response.SimpleResponse; 7 | 8 | public class GetPublicKeyResponse extends SimpleResponse { 9 | @Override 10 | public String getType() { 11 | return "getPublicKey"; 12 | } 13 | 14 | @Override 15 | public void execute(ChannelHandlerContext ctx, Client client) { 16 | sendResult(new GetPublicKeyRequestEvent(server.keyAgreementManager.rsaPublicKey, server.keyAgreementManager.ecdsaPublicKey)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/response/profile/ProfileByUsername.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.response.profile; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import pro.gravit.launcher.base.events.request.ProfileByUsernameRequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | import pro.gravit.launchserver.auth.AuthProviderPair; 7 | import pro.gravit.launchserver.socket.Client; 8 | import pro.gravit.launchserver.socket.response.SimpleResponse; 9 | 10 | public class ProfileByUsername extends SimpleResponse { 11 | String username; 12 | String client; 13 | 14 | @Override 15 | public String getType() { 16 | return "profileByUsername"; 17 | } 18 | 19 | @Override 20 | public void execute(ChannelHandlerContext ctx, Client client) { 21 | AuthProviderPair pair = client.auth; 22 | if (pair == null) pair = server.config.getAuthProviderPair(); 23 | PlayerProfile profile = server.authManager.getPlayerProfile(pair, username); 24 | if (profile == null) { 25 | sendError("User not found"); 26 | return; 27 | } 28 | sendResult(new ProfileByUsernameRequestEvent(profile)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LaunchServer/src/main/java/pro/gravit/launchserver/socket/severlet/StatusSeverlet.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.socket.severlet; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.codec.http.DefaultFullHttpResponse; 5 | import io.netty.handler.codec.http.FullHttpRequest; 6 | import io.netty.handler.codec.http.HttpResponseStatus; 7 | import pro.gravit.launchserver.socket.NettyConnectContext; 8 | import pro.gravit.launchserver.socket.handlers.NettyWebAPIHandler; 9 | 10 | public class StatusSeverlet implements NettyWebAPIHandler.SimpleSeverletHandler { 11 | @Override 12 | public void handle(ChannelHandlerContext ctx, FullHttpRequest msg, NettyConnectContext context) { 13 | sendHttpResponse(ctx, new DefaultFullHttpResponse(msg.protocolVersion(), HttpResponseStatus.OK)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LaunchServer/src/main/resources/experimental-build.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [], 3 | "info": [] 4 | } -------------------------------------------------------------------------------- /LaunchServer/src/test/java/pro/gravit/launchserver/FeatureCollectionTest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import org.junit.jupiter.api.Test; 5 | import pro.gravit.launchserver.auth.AuthProviderPair; 6 | import pro.gravit.launchserver.auth.Feature; 7 | 8 | public class FeatureCollectionTest { 9 | public static class TestClass1 implements TextInterface1 { 10 | 11 | } 12 | 13 | @Feature("test") 14 | public interface TextInterface1 { 15 | 16 | } 17 | 18 | @Test 19 | public void simpleTest() { 20 | var set = AuthProviderPair.getFeatures(TestClass1.class); 21 | Assertions.assertTrue(set.contains("test")); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LaunchServer/src/test/java/pro/gravit/launchserver/impl/TestLaunchServerConfigManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launchserver.impl; 2 | 3 | import pro.gravit.launchserver.LaunchServer; 4 | import pro.gravit.launchserver.config.LaunchServerConfig; 5 | import pro.gravit.launchserver.config.LaunchServerRuntimeConfig; 6 | 7 | public class TestLaunchServerConfigManager implements LaunchServer.LaunchServerConfigManager { 8 | public LaunchServerConfig config; 9 | public LaunchServerRuntimeConfig runtimeConfig; 10 | 11 | public TestLaunchServerConfigManager() { 12 | config = LaunchServerConfig.getDefault(LaunchServer.LaunchServerEnv.TEST); 13 | runtimeConfig = new LaunchServerRuntimeConfig(); 14 | runtimeConfig.reset(); 15 | } 16 | 17 | @Override 18 | public LaunchServerConfig readConfig() { 19 | return config; 20 | } 21 | 22 | @Override 23 | public LaunchServerRuntimeConfig readRuntimeConfig() { 24 | return runtimeConfig; 25 | } 26 | 27 | @Override 28 | public void writeConfig(LaunchServerConfig config) { 29 | 30 | } 31 | 32 | @Override 33 | public void writeRuntimeConfig(LaunchServerRuntimeConfig config) { 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LaunchServer/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Launcher/runtime/README.txt: -------------------------------------------------------------------------------- 1 | Скопируйте в эту папку файлы в соответствии с инструкцией по установке вашего модуля GUI 2 | Старый рантайм на JavaScript больше не поддерживается -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/NewLauncherSettings.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime; 2 | 3 | import pro.gravit.launcher.runtime.client.UserSettings; 4 | import pro.gravit.launcher.core.LauncherNetworkAPI; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public class NewLauncherSettings { 10 | @LauncherNetworkAPI 11 | public Map userSettings = new HashMap<>(); 12 | @LauncherNetworkAPI 13 | public String consoleUnlockKey; 14 | } 15 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/RuntimeGsonManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client; 2 | 3 | import com.google.gson.GsonBuilder; 4 | import pro.gravit.launcher.start.RuntimeModuleManager; 5 | import pro.gravit.launcher.core.managers.GsonManager; 6 | import pro.gravit.launcher.base.modules.events.PreGsonPhase; 7 | import pro.gravit.launcher.base.request.websockets.ClientWebSocketService; 8 | import pro.gravit.utils.UniversalJsonAdapter; 9 | 10 | public class RuntimeGsonManager extends GsonManager { 11 | private final RuntimeModuleManager moduleManager; 12 | 13 | public RuntimeGsonManager(RuntimeModuleManager moduleManager) { 14 | this.moduleManager = moduleManager; 15 | } 16 | 17 | @Override 18 | public void registerAdapters(GsonBuilder builder) { 19 | super.registerAdapters(builder); 20 | builder.registerTypeAdapter(UserSettings.class, new UniversalJsonAdapter<>(UserSettings.providers)); 21 | ClientWebSocketService.appendTypeAdapters(builder); 22 | moduleManager.invokeEvent(new PreGsonPhase(builder)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/UserSettings.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client; 2 | 3 | import pro.gravit.utils.ProviderMap; 4 | 5 | public class UserSettings { 6 | public static final ProviderMap providers = new ProviderMap<>(); 7 | } 8 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientEngineInitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.LauncherEngine; 4 | import pro.gravit.launcher.base.modules.events.InitPhase; 5 | 6 | public class ClientEngineInitPhase extends InitPhase { 7 | public final LauncherEngine engine; 8 | 9 | public ClientEngineInitPhase(LauncherEngine engine) { 10 | this.engine = engine; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientGuiPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.gui.RuntimeProvider; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientGuiPhase extends LauncherModule.Event { 7 | public final RuntimeProvider runtimeProvider; 8 | 9 | public ClientGuiPhase(RuntimeProvider runtimeProvider) { 10 | this.runtimeProvider = runtimeProvider; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientPreGuiPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.gui.RuntimeProvider; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientPreGuiPhase extends LauncherModule.Event { 7 | public RuntimeProvider runtimeProvider; 8 | 9 | public ClientPreGuiPhase(RuntimeProvider runtimeProvider) { 10 | this.runtimeProvider = runtimeProvider; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientProcessBuilderCreateEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.client.ClientLauncherProcess; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientProcessBuilderCreateEvent extends LauncherModule.Event { 7 | public final ClientLauncherProcess processBuilder; 8 | 9 | public ClientProcessBuilderCreateEvent(ClientLauncherProcess processBuilder) { 10 | this.processBuilder = processBuilder; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientProcessBuilderLaunchedEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.client.ClientLauncherProcess; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientProcessBuilderLaunchedEvent extends LauncherModule.Event { 7 | public final ClientLauncherProcess processBuilder; 8 | 9 | public ClientProcessBuilderLaunchedEvent(ClientLauncherProcess processBuilder) { 10 | this.processBuilder = processBuilder; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientProcessBuilderParamsWrittedEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.client.ClientLauncherProcess; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientProcessBuilderParamsWrittedEvent extends LauncherModule.Event { 7 | public final ClientLauncherProcess process; 8 | 9 | public ClientProcessBuilderParamsWrittedEvent(ClientLauncherProcess process) { 10 | this.process = process; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/client/events/ClientProcessBuilderPreLaunchEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.client.events; 2 | 3 | import pro.gravit.launcher.runtime.client.ClientLauncherProcess; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientProcessBuilderPreLaunchEvent extends LauncherModule.Event { 7 | public final ClientLauncherProcess processBuilder; 8 | 9 | public ClientProcessBuilderPreLaunchEvent(ClientLauncherProcess processBuilder) { 10 | this.processBuilder = processBuilder; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/console/GetConnectUUIDCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.console; 2 | 3 | import pro.gravit.launcher.base.request.management.GetConnectUUIDRequest; 4 | import pro.gravit.utils.command.Command; 5 | import pro.gravit.utils.helper.LogHelper; 6 | 7 | public class GetConnectUUIDCommand extends Command { 8 | @Override 9 | public String getArgsDescription() { 10 | return null; 11 | } 12 | 13 | @Override 14 | public String getUsageDescription() { 15 | return "Get your connectUUID"; 16 | } 17 | 18 | @Override 19 | public void invoke(String... args) throws Exception { 20 | var response = new GetConnectUUIDRequest().request(); 21 | LogHelper.info("Your connectUUID: %s | shardId %d", response.connectUUID.toString(), response.shardId); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/console/GetPublicKeyCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.console; 2 | 3 | import pro.gravit.launcher.runtime.LauncherEngine; 4 | import pro.gravit.utils.command.Command; 5 | import pro.gravit.utils.helper.LogHelper; 6 | 7 | import java.util.Base64; 8 | 9 | public class GetPublicKeyCommand extends Command { 10 | private final LauncherEngine engine; 11 | 12 | public GetPublicKeyCommand(LauncherEngine engine) { 13 | this.engine = engine; 14 | } 15 | 16 | @Override 17 | public String getArgsDescription() { 18 | return "[]"; 19 | } 20 | 21 | @Override 22 | public String getUsageDescription() { 23 | return "print public key in base64 format"; 24 | } 25 | 26 | @Override 27 | public void invoke(String... args) { 28 | LogHelper.info("PublicKey: %s", Base64.getEncoder().encodeToString(engine.getClientPublicKey().getEncoded())); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/console/SignDataCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.console; 2 | 3 | import pro.gravit.launcher.runtime.LauncherEngine; 4 | import pro.gravit.utils.command.Command; 5 | import pro.gravit.utils.helper.LogHelper; 6 | 7 | import java.util.Base64; 8 | 9 | public class SignDataCommand extends Command { 10 | private final LauncherEngine engine; 11 | 12 | public SignDataCommand(LauncherEngine engine) { 13 | this.engine = engine; 14 | } 15 | 16 | @Override 17 | public String getArgsDescription() { 18 | return "[base64 data]"; 19 | } 20 | 21 | @Override 22 | public String getUsageDescription() { 23 | return "sign any data"; 24 | } 25 | 26 | @Override 27 | public void invoke(String... args) throws Exception { 28 | verifyArgs(args, 1); 29 | byte[] data = Base64.getDecoder().decode(args[0]); 30 | byte[] signature = engine.sign(data); 31 | String base64 = Base64.getEncoder().encodeToString(signature); 32 | LogHelper.info("Signature: %s", base64); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/console/UnlockCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.console; 2 | 3 | import pro.gravit.launcher.runtime.managers.ConsoleManager; 4 | import pro.gravit.launcher.runtime.managers.SettingsManager; 5 | import pro.gravit.utils.command.Command; 6 | import pro.gravit.utils.helper.LogHelper; 7 | 8 | public class UnlockCommand extends Command { 9 | @Override 10 | public String getArgsDescription() { 11 | return "[key]"; 12 | } 13 | 14 | @Override 15 | public String getUsageDescription() { 16 | return "Unlock console commands"; 17 | } 18 | 19 | @Override 20 | public void invoke(String... args) throws Exception { 21 | verifyArgs(args, 1); 22 | if (ConsoleManager.checkUnlockKey(args[0])) { 23 | LogHelper.info("Unlock successful"); 24 | if (!ConsoleManager.unlock()) { 25 | LogHelper.error("Console unlock canceled"); 26 | return; 27 | } 28 | LogHelper.info("Write unlock key"); 29 | SettingsManager.settings.consoleUnlockKey = args[0]; 30 | } else { 31 | LogHelper.error("Unlock key incorrect"); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/debug/DebugLauncherTrustManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.debug; 2 | 3 | import pro.gravit.launcher.core.LauncherTrustManager; 4 | 5 | import java.security.cert.X509Certificate; 6 | 7 | public class DebugLauncherTrustManager extends LauncherTrustManager { 8 | private final TrustDebugMode mode; 9 | 10 | public DebugLauncherTrustManager(X509Certificate[] trustSigners) { 11 | super(trustSigners); 12 | this.mode = null; 13 | } 14 | 15 | public DebugLauncherTrustManager() { 16 | super(new X509Certificate[0]); 17 | this.mode = null; 18 | } 19 | 20 | public DebugLauncherTrustManager(TrustDebugMode mode) { 21 | super(new X509Certificate[0]); 22 | this.mode = mode; 23 | } 24 | 25 | @Override 26 | public CheckClassResult checkCertificates(X509Certificate[] certs, CertificateChecker checker) { 27 | if (mode == TrustDebugMode.TRUST_ALL) return new CheckClassResult(CheckClassResultType.SUCCESS, null, null); 28 | return super.checkCertificates(certs, checker); 29 | } 30 | 31 | public enum TrustDebugMode { 32 | TRUST_ALL 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/debug/DebugMainInlineInitializer.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.debug; 2 | 3 | public class DebugMainInlineInitializer { 4 | public static void run() throws Exception { 5 | DebugMain.initialize(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/gui/NoRuntimeProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.gui; 2 | 3 | import javax.swing.*; 4 | 5 | public class NoRuntimeProvider implements RuntimeProvider { 6 | @Override 7 | public void run(String[] args) { 8 | JOptionPane.showMessageDialog(null, "Модуль графического интерфейса лаунчера отсутствует"); 9 | } 10 | 11 | @Override 12 | public void preLoad() { 13 | 14 | } 15 | 16 | @Override 17 | public void init(boolean clientInstance) { 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/gui/RuntimeProvider.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.gui; 2 | 3 | public interface RuntimeProvider { 4 | void run(String[] args); 5 | 6 | void preLoad(); 7 | 8 | void init(boolean clientInstance); 9 | } 10 | -------------------------------------------------------------------------------- /Launcher/src/main/java/pro/gravit/launcher/runtime/managers/SettingsManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.runtime.managers; 2 | 3 | import pro.gravit.launcher.runtime.NewLauncherSettings; 4 | import pro.gravit.launcher.runtime.client.DirBridge; 5 | import pro.gravit.launcher.base.config.JsonConfigurable; 6 | import pro.gravit.utils.helper.LogHelper; 7 | 8 | public class SettingsManager extends JsonConfigurable { 9 | public static NewLauncherSettings settings; 10 | 11 | 12 | public SettingsManager() { 13 | super(NewLauncherSettings.class, DirBridge.dir.resolve("settings.json")); 14 | } 15 | 16 | @Override 17 | public NewLauncherSettings getConfig() { 18 | return settings; 19 | } 20 | 21 | @Override 22 | public void setConfig(NewLauncherSettings config) { 23 | settings = config; 24 | if (settings.consoleUnlockKey != null && !ConsoleManager.isConsoleUnlock) { 25 | if (ConsoleManager.checkUnlockKey(settings.consoleUnlockKey)) { 26 | ConsoleManager.unlock(); 27 | LogHelper.info("Console auto unlocked"); 28 | } 29 | } 30 | } 31 | 32 | @Override 33 | public NewLauncherSettings getDefaultConfig() { 34 | return new NewLauncherSettings(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/api/AuthService.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.api; 2 | 3 | import pro.gravit.launcher.base.ClientPermissions; 4 | import pro.gravit.launcher.base.profiles.ClientProfile; 5 | 6 | import java.util.List; 7 | import java.util.UUID; 8 | 9 | public class AuthService { 10 | public static String projectName; 11 | public static String username; 12 | public static ClientPermissions permissions = new ClientPermissions(); 13 | public static UUID uuid; 14 | public static ClientProfile profile; 15 | 16 | public static boolean hasPermission(String permission) { 17 | return permissions.hasPerm(permission); 18 | } 19 | 20 | public static boolean hasRole(String role) { 21 | return permissions.hasRole(role); 22 | } 23 | 24 | public static List getRoles() { 25 | return permissions.getRoles(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/api/ConfigService.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.api; 2 | 3 | public class ConfigService { 4 | public static boolean disableLogging; 5 | public static String serverName; 6 | public static CheckServerConfig checkServerConfig = new CheckServerConfig(); 7 | public static class CheckServerConfig { 8 | public boolean needProperties; 9 | public boolean needHardware; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/api/KeyService.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.api; 2 | 3 | import java.security.interfaces.ECPublicKey; 4 | import java.security.interfaces.RSAPublicKey; 5 | 6 | public class KeyService { 7 | public static RSAPublicKey serverRsaPublicKey; 8 | public static ECPublicKey serverEcPublicKey; 9 | } 10 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/config/JsonConfigurable.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.config; 2 | 3 | import java.lang.reflect.Type; 4 | import java.nio.file.Path; 5 | 6 | public abstract class JsonConfigurable implements JsonConfigurableInterface { 7 | protected transient final Path configPath; 8 | private transient final Type type; 9 | 10 | 11 | public JsonConfigurable(Type type, Path configPath) { 12 | this.type = type; 13 | this.configPath = configPath; 14 | } 15 | 16 | @Override 17 | public Path getPath() { 18 | return configPath; 19 | } 20 | 21 | @Override 22 | public Type getType() { 23 | return type; 24 | } 25 | 26 | 27 | public abstract T getConfig(); 28 | 29 | public abstract void setConfig(T config); 30 | 31 | public abstract T getDefaultConfig(); 32 | } 33 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/config/SimpleConfig.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.config; 2 | 3 | import java.lang.invoke.MethodHandles; 4 | import java.lang.invoke.MethodType; 5 | import java.lang.reflect.Type; 6 | import java.nio.file.Path; 7 | 8 | public abstract class SimpleConfig implements JsonConfigurableInterface { 9 | protected transient final Path configPath; 10 | private transient final Class type; 11 | 12 | protected SimpleConfig(Class type, Path configPath) { 13 | this.type = type; 14 | this.configPath = configPath; 15 | } 16 | 17 | @SuppressWarnings("unchecked") 18 | @Override 19 | public T getConfig() { 20 | return (T) this; 21 | } 22 | 23 | @SuppressWarnings("unchecked") 24 | @Override 25 | public T getDefaultConfig() { 26 | try { 27 | return (T) MethodHandles.publicLookup().findConstructor(type, MethodType.methodType(void.class)).invokeWithArguments(); 28 | } catch (Throwable e) { 29 | return null; 30 | } 31 | } 32 | 33 | @Override 34 | public Path getPath() { 35 | return configPath; 36 | } 37 | 38 | @Override 39 | public Type getType() { 40 | return type; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/config/SimpleConfigurable.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.config; 2 | 3 | import java.lang.invoke.MethodHandles; 4 | import java.lang.invoke.MethodType; 5 | import java.nio.file.Path; 6 | 7 | public class SimpleConfigurable extends JsonConfigurable { 8 | private final Class tClass; 9 | public T config; 10 | 11 | public SimpleConfigurable(Class type, Path configPath) { 12 | super(type, configPath); 13 | tClass = type; 14 | } 15 | 16 | @Override 17 | public T getConfig() { 18 | return config; 19 | } 20 | 21 | @Override 22 | public void setConfig(T config) { 23 | this.config = config; 24 | } 25 | 26 | @SuppressWarnings("unchecked") 27 | @Override 28 | public T getDefaultConfig() { 29 | try { 30 | return (T) MethodHandles.publicLookup().findConstructor(tClass, MethodType.methodType(void.class)).invokeWithArguments(); 31 | } catch (Throwable e) { 32 | return null; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/ExtendedTokenRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events; 2 | 3 | public interface ExtendedTokenRequestEvent { 4 | String getExtendedTokenName(); 5 | 6 | String getExtendedToken(); 7 | 8 | long getExtendedTokenExpire(); 9 | } 10 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/NotificationEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.request.WebSocketEvent; 5 | 6 | public class NotificationEvent implements WebSocketEvent { 7 | @LauncherNetworkAPI 8 | public final String head; 9 | @LauncherNetworkAPI 10 | public final String message; 11 | @LauncherNetworkAPI 12 | public final NotificationType icon; 13 | 14 | public NotificationEvent(String head, String message) { 15 | this.head = head; 16 | this.message = message; 17 | this.icon = NotificationType.INFO; 18 | } 19 | 20 | public NotificationEvent(String head, String message, NotificationType icon) { 21 | this.head = head; 22 | this.message = message; 23 | this.icon = icon; 24 | } 25 | 26 | @Override 27 | public String getType() { 28 | return "notification"; 29 | } 30 | 31 | public enum NotificationType { 32 | INFO, WARN, ERROR, OTHER 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/RequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.request.WebSocketEvent; 5 | 6 | import java.util.UUID; 7 | 8 | /** 9 | * The class of all request events sent by the server to the client 10 | */ 11 | public abstract class RequestEvent implements WebSocketEvent { 12 | public static final UUID eventUUID = UUID.fromString("fac0e2bd-9820-4449-b191-1d7c9bf781be"); 13 | /** 14 | * UUID sent in request 15 | */ 16 | @LauncherNetworkAPI 17 | public UUID requestUUID; 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/AdditionalDataRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.util.Map; 6 | 7 | public class AdditionalDataRequestEvent extends RequestEvent { 8 | public Map data; 9 | 10 | public AdditionalDataRequestEvent() { 11 | } 12 | 13 | public AdditionalDataRequestEvent(Map data) { 14 | this.data = data; 15 | } 16 | 17 | @Override 18 | public String getType() { 19 | return "additionalData"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/AssetUploadInfoRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.util.Set; 6 | 7 | public class AssetUploadInfoRequestEvent extends RequestEvent { 8 | public Set available; 9 | public SlimSupportConf slimSupportConf; 10 | 11 | public AssetUploadInfoRequestEvent(Set available, SlimSupportConf slimSupportConf) { 12 | this.available = available; 13 | this.slimSupportConf = slimSupportConf; 14 | } 15 | 16 | @Override 17 | public String getType() { 18 | return "assetUploadInfo"; 19 | } 20 | 21 | public enum SlimSupportConf { 22 | UNSUPPORTED, USER, SERVER 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/BatchProfileByUsernameRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | 7 | public class BatchProfileByUsernameRequestEvent extends RequestEvent { 8 | @LauncherNetworkAPI 9 | public String error; 10 | @LauncherNetworkAPI 11 | public PlayerProfile[] playerProfiles; 12 | 13 | public BatchProfileByUsernameRequestEvent(PlayerProfile[] profiles) { 14 | this.playerProfiles = profiles; 15 | } 16 | 17 | public BatchProfileByUsernameRequestEvent() { 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "batchProfileByUsername"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/CheckServerRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | 7 | import java.util.Map; 8 | import java.util.UUID; 9 | 10 | 11 | public class CheckServerRequestEvent extends RequestEvent { 12 | @SuppressWarnings("unused") 13 | private static final UUID _uuid = UUID.fromString("8801d07c-51ba-4059-b61d-fe1f1510b28a"); 14 | @LauncherNetworkAPI 15 | public UUID uuid; 16 | @LauncherNetworkAPI 17 | public PlayerProfile playerProfile; 18 | @LauncherNetworkAPI 19 | public String sessionId; 20 | @LauncherNetworkAPI 21 | public String hardwareId; 22 | @LauncherNetworkAPI 23 | public Map sessionProperties; 24 | 25 | public CheckServerRequestEvent(PlayerProfile playerProfile) { 26 | this.playerProfile = playerProfile; 27 | } 28 | 29 | public CheckServerRequestEvent() { 30 | } 31 | 32 | @Override 33 | public String getType() { 34 | return "checkServer"; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/CurrentUserRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.ClientPermissions; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | 7 | public class CurrentUserRequestEvent extends RequestEvent { 8 | public final UserInfo userInfo; 9 | 10 | public CurrentUserRequestEvent(UserInfo userInfo) { 11 | this.userInfo = userInfo; 12 | } 13 | 14 | @Override 15 | public String getType() { 16 | return "currentUser"; 17 | } 18 | 19 | public static class UserInfo { 20 | public ClientPermissions permissions; 21 | public String accessToken; 22 | public PlayerProfile playerProfile; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/ErrorRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | 6 | import java.util.UUID; 7 | 8 | 9 | public class ErrorRequestEvent extends RequestEvent { 10 | public static UUID uuid = UUID.fromString("0af22bc7-aa01-4881-bdbb-dc62b3cdac96"); 11 | @LauncherNetworkAPI 12 | public final String error; 13 | 14 | public ErrorRequestEvent(String error) { 15 | this.error = error; 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "error"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/ExitRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | public class ExitRequestEvent extends RequestEvent { 6 | public final ExitReason reason; 7 | 8 | public ExitRequestEvent(ExitReason reason) { 9 | this.reason = reason; 10 | } 11 | 12 | @Override 13 | public String getType() { 14 | return "exit"; 15 | } 16 | 17 | public enum ExitReason { 18 | SERVER, CLIENT, TIMEOUT, NO_EXIT 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/FeaturesRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.util.Map; 6 | 7 | public class FeaturesRequestEvent extends RequestEvent { 8 | public Map features; 9 | 10 | public FeaturesRequestEvent() { 11 | } 12 | 13 | public FeaturesRequestEvent(Map features) { 14 | this.features = features; 15 | } 16 | 17 | @Override 18 | public String getType() { 19 | return "features"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/GetAssetUploadUrlRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | public class GetAssetUploadUrlRequestEvent extends RequestEvent { 6 | public static final String FEATURE_NAME = "assetupload"; 7 | public String url; 8 | public AuthRequestEvent.OAuthRequestEvent token; 9 | 10 | public GetAssetUploadUrlRequestEvent() { 11 | } 12 | 13 | public GetAssetUploadUrlRequestEvent(String url, AuthRequestEvent.OAuthRequestEvent token) { 14 | this.url = url; 15 | this.token = token; 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "getAssetUploadUrl"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/GetConnectUUIDRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.util.UUID; 6 | 7 | public class GetConnectUUIDRequestEvent extends RequestEvent { 8 | public UUID connectUUID; 9 | public int shardId; 10 | 11 | public GetConnectUUIDRequestEvent(UUID connectUUID, int shardId) { 12 | this.connectUUID = connectUUID; 13 | this.shardId = shardId; 14 | } 15 | 16 | @Override 17 | public String getType() { 18 | return "getConnectUUID"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/GetPublicKeyRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.security.interfaces.ECPublicKey; 6 | import java.security.interfaces.RSAPublicKey; 7 | 8 | public class GetPublicKeyRequestEvent extends RequestEvent { 9 | public byte[] rsaPublicKey; 10 | public byte[] ecdsaPublicKey; 11 | 12 | public GetPublicKeyRequestEvent(byte[] rsaPublicKey, byte[] ecdsaPublicKey) { 13 | this.rsaPublicKey = rsaPublicKey; 14 | this.ecdsaPublicKey = ecdsaPublicKey; 15 | } 16 | 17 | public GetPublicKeyRequestEvent(RSAPublicKey rsaPublicKey, ECPublicKey ecdsaPublicKey) { 18 | this.rsaPublicKey = rsaPublicKey.getEncoded(); 19 | this.ecdsaPublicKey = ecdsaPublicKey.getEncoded(); 20 | } 21 | 22 | @Override 23 | public String getType() { 24 | return "getPublicKey"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/GetSecureLevelInfoRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | public class GetSecureLevelInfoRequestEvent extends RequestEvent { 6 | public final byte[] verifySecureKey; 7 | public boolean enabled; 8 | 9 | public GetSecureLevelInfoRequestEvent(byte[] verifySecureKey) { 10 | this.verifySecureKey = verifySecureKey; 11 | } 12 | 13 | public GetSecureLevelInfoRequestEvent(byte[] verifySecureKey, boolean enabled) { 14 | this.verifySecureKey = verifySecureKey; 15 | this.enabled = enabled; 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "getSecureLevelInfo"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/HardwareReportRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.ExtendedTokenRequestEvent; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | 6 | public class HardwareReportRequestEvent extends RequestEvent implements ExtendedTokenRequestEvent { 7 | public String extendedToken; 8 | public long expire; 9 | 10 | public HardwareReportRequestEvent() { 11 | } 12 | 13 | public HardwareReportRequestEvent(String extendedToken, long expire) { 14 | this.extendedToken = extendedToken; 15 | this.expire = expire; 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "hardwareReport"; 21 | } 22 | 23 | @Override 24 | public String getExtendedTokenName() { 25 | return "hardware"; 26 | } 27 | 28 | @Override 29 | public String getExtendedToken() { 30 | return extendedToken; 31 | } 32 | 33 | @Override 34 | public long getExtendedTokenExpire() { 35 | return expire; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/JoinServerRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | 6 | import java.util.UUID; 7 | 8 | 9 | public class JoinServerRequestEvent extends RequestEvent { 10 | @SuppressWarnings("unused") 11 | private static final UUID uuid = UUID.fromString("2a12e7b5-3f4a-4891-a2f9-ea141c8e1995"); 12 | @LauncherNetworkAPI 13 | public final boolean allow; 14 | 15 | public JoinServerRequestEvent(boolean allow) { 16 | this.allow = allow; 17 | } 18 | 19 | @Override 20 | public String getType() { 21 | return "joinServer"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/ProfileByUUIDRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | 7 | import java.util.UUID; 8 | 9 | 10 | public class ProfileByUUIDRequestEvent extends RequestEvent { 11 | @SuppressWarnings("unused") 12 | private static final UUID uuid = UUID.fromString("b9014cf3-4b95-4d38-8c5f-867f190a18a0"); 13 | @LauncherNetworkAPI 14 | public String error; 15 | @LauncherNetworkAPI 16 | public PlayerProfile playerProfile; 17 | 18 | public ProfileByUUIDRequestEvent(PlayerProfile playerProfile) { 19 | this.playerProfile = playerProfile; 20 | } 21 | 22 | public ProfileByUUIDRequestEvent() { 23 | } 24 | 25 | @Override 26 | public String getType() { 27 | return "profileByUUID"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/ProfileByUsernameRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | 7 | import java.util.UUID; 8 | 9 | 10 | public class ProfileByUsernameRequestEvent extends RequestEvent { 11 | @SuppressWarnings("unused") 12 | private static final UUID uuid = UUID.fromString("06204302-ff6b-4779-b97d-541e3bc39aa1"); 13 | @LauncherNetworkAPI 14 | public final PlayerProfile playerProfile; 15 | @LauncherNetworkAPI 16 | public String error; 17 | 18 | public ProfileByUsernameRequestEvent(PlayerProfile playerProfile) { 19 | this.playerProfile = playerProfile; 20 | } 21 | 22 | @Override 23 | public String getType() { 24 | return "profileByUsername"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/ProfilesRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.ClientProfile; 6 | 7 | import java.util.List; 8 | import java.util.UUID; 9 | 10 | 11 | public class ProfilesRequestEvent extends RequestEvent { 12 | @SuppressWarnings("unused") 13 | private static final UUID uuid = UUID.fromString("2f26fbdf-598a-46dd-92fc-1699c0e173b1"); 14 | @LauncherNetworkAPI 15 | public List profiles; 16 | 17 | public ProfilesRequestEvent(List profiles) { 18 | this.profiles = profiles; 19 | } 20 | 21 | public ProfilesRequestEvent() { 22 | } 23 | 24 | @Override 25 | public String getType() { 26 | return "profiles"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/RefreshTokenRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | public class RefreshTokenRequestEvent extends RequestEvent { 6 | public AuthRequestEvent.OAuthRequestEvent oauth; 7 | 8 | public RefreshTokenRequestEvent(AuthRequestEvent.OAuthRequestEvent oauth) { 9 | this.oauth = oauth; 10 | } 11 | 12 | @Override 13 | public String getType() { 14 | return "refreshToken"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/RestoreRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | import java.util.List; 6 | 7 | public class RestoreRequestEvent extends RequestEvent { 8 | public CurrentUserRequestEvent.UserInfo userInfo; 9 | public List invalidTokens; 10 | 11 | public RestoreRequestEvent() { 12 | } 13 | 14 | public RestoreRequestEvent(CurrentUserRequestEvent.UserInfo userInfo) { 15 | this.userInfo = userInfo; 16 | } 17 | 18 | public RestoreRequestEvent(CurrentUserRequestEvent.UserInfo userInfo, List invalidTokens) { 19 | this.userInfo = userInfo; 20 | this.invalidTokens = invalidTokens; 21 | } 22 | 23 | public RestoreRequestEvent(List invalidTokens) { 24 | this.invalidTokens = invalidTokens; 25 | } 26 | 27 | @Override 28 | public String getType() { 29 | return "restore"; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/SecurityReportRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.base.events.RequestEvent; 4 | 5 | public class SecurityReportRequestEvent extends RequestEvent { 6 | public final ReportAction action; 7 | public final String otherAction; 8 | 9 | public SecurityReportRequestEvent(ReportAction action) { 10 | this.action = action; 11 | this.otherAction = null; 12 | } 13 | 14 | public SecurityReportRequestEvent(String otherAction) { 15 | this.action = ReportAction.OTHER; 16 | this.otherAction = otherAction; 17 | } 18 | 19 | public SecurityReportRequestEvent() { 20 | this.action = ReportAction.NONE; 21 | this.otherAction = null; 22 | } 23 | 24 | @Override 25 | public String getType() { 26 | return "securityReport"; 27 | } 28 | 29 | public enum ReportAction { 30 | NONE, 31 | LOGOUT, 32 | TOKEN_EXPIRED, 33 | EXIT, 34 | @Deprecated 35 | CRASH, 36 | OTHER 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/SetProfileRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.base.profiles.ClientProfile; 6 | 7 | import java.util.UUID; 8 | 9 | 10 | public class SetProfileRequestEvent extends RequestEvent { 11 | @SuppressWarnings("unused") 12 | private static final UUID uuid = UUID.fromString("08c0de9e-4364-4152-9066-8354a3a48541"); 13 | @LauncherNetworkAPI 14 | public final ClientProfile newProfile; 15 | 16 | public SetProfileRequestEvent(ClientProfile newProfile) { 17 | this.newProfile = newProfile; 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "setProfile"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/events/request/UpdateRequestEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.events.request; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.RequestEvent; 5 | import pro.gravit.launcher.core.hasher.HashedDir; 6 | 7 | public class UpdateRequestEvent extends RequestEvent { 8 | @LauncherNetworkAPI 9 | public final HashedDir hdir; 10 | @LauncherNetworkAPI 11 | public final boolean zip; 12 | @LauncherNetworkAPI 13 | public String url; 14 | @LauncherNetworkAPI 15 | public boolean fullDownload; 16 | 17 | public UpdateRequestEvent(HashedDir hdir) { 18 | this.hdir = hdir; 19 | this.zip = false; 20 | } 21 | 22 | public UpdateRequestEvent(HashedDir hdir, String url) { 23 | this.hdir = hdir; 24 | this.url = url; 25 | this.zip = false; 26 | } 27 | 28 | public UpdateRequestEvent(HashedDir hdir, String url, boolean zip) { 29 | this.hdir = hdir; 30 | this.url = url; 31 | this.zip = zip; 32 | } 33 | 34 | @Override 35 | public String getType() { 36 | return "update"; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/LauncherInitContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules; 2 | 3 | public interface LauncherInitContext { 4 | } 5 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/LauncherModulesContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules; 2 | 3 | import java.net.URL; 4 | 5 | public interface LauncherModulesContext { 6 | LauncherModulesManager getModulesManager(); 7 | 8 | ModulesConfigManager getModulesConfigManager(); 9 | 10 | void addURL(URL url); 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/ModulesConfigManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules; 2 | 3 | import pro.gravit.launcher.base.config.SimpleConfigurable; 4 | 5 | import java.nio.file.Path; 6 | 7 | public interface ModulesConfigManager { 8 | Path getModuleConfig(String moduleName); 9 | 10 | Path getModuleConfig(String moduleName, String configName); 11 | 12 | Path getModuleConfigDir(String moduleName); 13 | 14 | SimpleConfigurable getConfigurable(Class tClass, Path configPath); 15 | 16 | default SimpleConfigurable getConfigurable(Class tClass, String moduleName) { 17 | return getConfigurable(tClass, getModuleConfig(moduleName)); 18 | } 19 | 20 | default SimpleConfigurable getConfigurable(Class tClass, String moduleName, String configName) { 21 | return getConfigurable(tClass, getModuleConfig(moduleName, configName)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/ClosePhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class ClosePhase extends LauncherModule.Event { 6 | } 7 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/InitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class InitPhase extends LauncherModule.Event { 6 | } 7 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/OfflineModeEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launcher.base.request.RequestService; 5 | 6 | public class OfflineModeEvent extends LauncherModule.Event { 7 | public RequestService service; 8 | 9 | public OfflineModeEvent(RequestService service) { 10 | this.service = service; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/PostInitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class PostInitPhase extends LauncherModule.Event { 6 | } 7 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/PreConfigPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class PreConfigPhase extends LauncherModule.Event { 6 | } 7 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/events/PreGsonPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.events; 2 | 3 | import com.google.gson.GsonBuilder; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class PreGsonPhase extends LauncherModule.Event { 7 | public final GsonBuilder gsonBuilder; 8 | 9 | public PreGsonPhase(GsonBuilder gsonBuilder) { 10 | this.gsonBuilder = gsonBuilder; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/modules/impl/SimpleModuleContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.modules.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModulesContext; 4 | import pro.gravit.launcher.base.modules.LauncherModulesManager; 5 | import pro.gravit.launcher.base.modules.ModulesConfigManager; 6 | 7 | import java.net.URL; 8 | 9 | public class SimpleModuleContext implements LauncherModulesContext { 10 | public final LauncherModulesManager modulesManager; 11 | public final ModulesConfigManager configManager; 12 | 13 | public SimpleModuleContext(LauncherModulesManager modulesManager, ModulesConfigManager configManager) { 14 | this.modulesManager = modulesManager; 15 | this.configManager = configManager; 16 | } 17 | 18 | @Override 19 | public void addURL(URL url) { 20 | if(modulesManager instanceof SimpleModuleManager s) { 21 | s.addUrlToClassLoader(url); 22 | } else { 23 | throw new UnsupportedOperationException(); 24 | } 25 | } 26 | 27 | @Override 28 | public LauncherModulesManager getModulesManager() { 29 | return modulesManager; 30 | } 31 | 32 | @Override 33 | public ModulesConfigManager getModulesConfigManager() { 34 | return configManager; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/OptionalDepend.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | 5 | public class OptionalDepend { 6 | @LauncherNetworkAPI 7 | public String name; 8 | } 9 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/actions/OptionalAction.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.actions; 2 | 3 | import pro.gravit.utils.ProviderMap; 4 | 5 | public class OptionalAction { 6 | public static final ProviderMap providers = new ProviderMap<>(); 7 | private static boolean registerProviders = false; 8 | 9 | public static void registerProviders() { 10 | if (!registerProviders) { 11 | providers.register("file", OptionalActionFile.class); 12 | providers.register("clientArgs", OptionalActionClientArgs.class); 13 | providers.register("jvmArgs", OptionalActionJvmArgs.class); 14 | providers.register("classpath", OptionalActionClassPath.class); 15 | registerProviders = true; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/actions/OptionalActionClassPath.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.actions; 2 | 3 | import java.util.List; 4 | 5 | public class OptionalActionClassPath extends OptionalAction { 6 | public List args; 7 | public boolean useAltClasspath = false; 8 | 9 | public OptionalActionClassPath() { 10 | } 11 | 12 | public OptionalActionClassPath(List args) { 13 | this.args = args; 14 | } 15 | 16 | public OptionalActionClassPath(List args, boolean useAltClasspath) { 17 | this.args = args; 18 | this.useAltClasspath = useAltClasspath; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/actions/OptionalActionClientArgs.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.actions; 2 | 3 | import java.util.List; 4 | 5 | public class OptionalActionClientArgs extends OptionalAction { 6 | public List args; 7 | 8 | public OptionalActionClientArgs() { 9 | } 10 | 11 | public OptionalActionClientArgs(List args) { 12 | this.args = args; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/actions/OptionalActionJvmArgs.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.actions; 2 | 3 | import java.util.List; 4 | 5 | public class OptionalActionJvmArgs extends OptionalAction { 6 | public List args; 7 | 8 | public OptionalActionJvmArgs() { 9 | } 10 | 11 | public OptionalActionJvmArgs(List args) { 12 | this.args = args; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/triggers/ArchTrigger.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.triggers; 2 | 3 | import pro.gravit.launcher.base.profiles.optional.OptionalFile; 4 | import pro.gravit.utils.helper.JVMHelper; 5 | 6 | public class ArchTrigger extends OptionalTrigger { 7 | public JVMHelper.ARCH arch; 8 | 9 | @Override 10 | protected boolean isTriggered(OptionalFile optional, OptionalTriggerContext context) { 11 | return context.getJavaVersion().arch == arch; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/triggers/OSTrigger.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.triggers; 2 | 3 | import pro.gravit.launcher.base.profiles.optional.OptionalFile; 4 | import pro.gravit.utils.helper.JVMHelper; 5 | 6 | public class OSTrigger extends OptionalTrigger { 7 | public JVMHelper.OS os; 8 | 9 | public OSTrigger(JVMHelper.OS os) { 10 | this.os = os; 11 | } 12 | 13 | @Override 14 | public boolean isTriggered(OptionalFile optional, OptionalTriggerContext context) { 15 | return JVMHelper.OS_TYPE == os; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/triggers/OptionalTrigger.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.triggers; 2 | 3 | import pro.gravit.launcher.base.profiles.optional.OptionalFile; 4 | import pro.gravit.utils.ProviderMap; 5 | 6 | public abstract class OptionalTrigger { 7 | public static ProviderMap providers = new ProviderMap<>("OptionalTriggers"); 8 | private static boolean isRegisteredProviders = false; 9 | public boolean required; 10 | public boolean inverted; 11 | 12 | public static void registerProviders() { 13 | if (!isRegisteredProviders) { 14 | providers.register("java", JavaTrigger.class); 15 | providers.register("os", OSTrigger.class); 16 | providers.register("arch", ArchTrigger.class); 17 | isRegisteredProviders = true; 18 | } 19 | } 20 | 21 | protected abstract boolean isTriggered(OptionalFile optional, OptionalTriggerContext context); 22 | 23 | public boolean check(OptionalFile optional, OptionalTriggerContext context) { 24 | boolean result = isTriggered(optional, context); 25 | if (inverted) result = !result; 26 | return result; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/profiles/optional/triggers/OptionalTriggerContext.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.profiles.optional.triggers; 2 | 3 | import pro.gravit.launcher.base.ClientPermissions; 4 | import pro.gravit.launcher.base.profiles.ClientProfile; 5 | import pro.gravit.launcher.base.profiles.PlayerProfile; 6 | import pro.gravit.utils.helper.JavaHelper; 7 | 8 | public interface OptionalTriggerContext { 9 | ClientProfile getProfile(); 10 | 11 | String getUsername(); 12 | 13 | JavaHelper.JavaVersion getJavaVersion(); 14 | 15 | default ClientPermissions getPermissions() { 16 | return ClientPermissions.DEFAULT; 17 | } 18 | 19 | default PlayerProfile getPlayerProfile() { 20 | return null; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/JsonResultSerializeAdapter.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request; 2 | 3 | import com.google.gson.*; 4 | 5 | import java.lang.reflect.Type; 6 | 7 | public class JsonResultSerializeAdapter implements JsonSerializer { 8 | private static final String PROP_NAME = "type"; 9 | 10 | @Override 11 | public JsonElement serialize(WebSocketEvent src, Type typeOfSrc, JsonSerializationContext context) { 12 | // note : won't work, you must delegate this 13 | JsonObject jo = context.serialize(src).getAsJsonObject(); 14 | 15 | String classPath = src.getType(); 16 | jo.add(PROP_NAME, new JsonPrimitive(classPath)); 17 | 18 | return jo; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/PingRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request; 2 | 3 | public final class PingRequest extends Request { 4 | 5 | @Override 6 | public String getType() { 7 | return null; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/RequestException.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request; 2 | 3 | import java.io.IOException; 4 | 5 | public final class RequestException extends IOException { 6 | 7 | 8 | public RequestException(String message) { 9 | super(message); 10 | } 11 | 12 | 13 | public RequestException(String message, Throwable exc) { 14 | super(message, exc); 15 | } 16 | 17 | 18 | public RequestException(Throwable exc) { 19 | super(exc); 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return getMessage(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/WebSocketEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request; 2 | 3 | import pro.gravit.utils.TypeSerializeInterface; 4 | 5 | /** 6 | * The interface of all events sent by the server to the client 7 | */ 8 | public interface WebSocketEvent extends TypeSerializeInterface { 9 | String getType(); 10 | } 11 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/AdditionalDataRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.AdditionalDataRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | import java.util.UUID; 7 | 8 | public class AdditionalDataRequest extends Request { 9 | public String username; 10 | public UUID uuid; 11 | 12 | public AdditionalDataRequest(String username) { 13 | this.username = username; 14 | } 15 | 16 | public AdditionalDataRequest(UUID uuid) { 17 | this.uuid = uuid; 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "additionalData"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/CurrentUserRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.CurrentUserRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class CurrentUserRequest extends Request { 7 | @Override 8 | public String getType() { 9 | return "currentUser"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/ExitRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.ExitRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class ExitRequest extends Request { 7 | public final boolean exitAll; 8 | public final String username; 9 | 10 | public ExitRequest() { 11 | this.exitAll = false; 12 | this.username = null; 13 | } 14 | 15 | public ExitRequest(boolean exitAll) { 16 | this.exitAll = exitAll; 17 | this.username = null; 18 | } 19 | 20 | public ExitRequest(boolean exitAll, String username) { 21 | this.exitAll = exitAll; 22 | this.username = username; 23 | } 24 | 25 | @Override 26 | public String getType() { 27 | return "exit"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/FetchClientProfileKeyRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.FetchClientProfileKeyRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class FetchClientProfileKeyRequest extends Request { 7 | public FetchClientProfileKeyRequest() { 8 | } 9 | 10 | @Override 11 | public String getType() { 12 | return "clientProfileKey"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/GetPublicKeyRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.GetPublicKeyRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class GetPublicKeyRequest extends Request { 7 | public GetPublicKeyRequest() { 8 | } 9 | 10 | @Override 11 | public String getType() { 12 | return "getPublicKey"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/RefreshTokenRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.RefreshTokenRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class RefreshTokenRequest extends Request { 7 | public String authId; 8 | public String refreshToken; 9 | 10 | public RefreshTokenRequest(String authId, String refreshToken) { 11 | this.authId = authId; 12 | this.refreshToken = refreshToken; 13 | } 14 | 15 | @Override 16 | public String getType() { 17 | return "refreshToken"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/RestoreRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.base.events.request.RestoreRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | import java.util.Map; 7 | 8 | public class RestoreRequest extends Request { 9 | public String authId; 10 | public String accessToken; 11 | public Map extended; 12 | public boolean needUserInfo; 13 | 14 | public RestoreRequest() { 15 | } 16 | 17 | public RestoreRequest(String authId, String accessToken, Map extended, boolean needUserInfo) { 18 | this.authId = authId; 19 | this.accessToken = accessToken; 20 | this.extended = extended; 21 | this.needUserInfo = needUserInfo; 22 | } 23 | 24 | @Override 25 | public String getType() { 26 | return "restore"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/SetProfileRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.request.SetProfileRequestEvent; 5 | import pro.gravit.launcher.base.profiles.ClientProfile; 6 | import pro.gravit.launcher.base.request.Request; 7 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 8 | 9 | public class SetProfileRequest extends Request implements WebSocketRequest { 10 | @LauncherNetworkAPI 11 | public final String client; 12 | 13 | public SetProfileRequest(ClientProfile profile) { 14 | this.client = profile.getTitle(); 15 | } 16 | 17 | @Override 18 | public String getType() { 19 | return "setProfile"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/details/AuthLoginOnlyDetails.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.details; 2 | 3 | import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent; 4 | 5 | public class AuthLoginOnlyDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails { 6 | @Override 7 | public String getType() { 8 | return "loginonly"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/details/AuthPasswordDetails.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.details; 2 | 3 | import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent; 4 | 5 | public class AuthPasswordDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails { 6 | @Override 7 | public String getType() { 8 | return "password"; 9 | } 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/details/AuthTotpDetails.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.details; 2 | 3 | import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent; 4 | 5 | public class AuthTotpDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails { 6 | public final String alg; 7 | public final int maxKeyLength; 8 | 9 | public AuthTotpDetails(String alg, int maxKeyLength) { 10 | this.alg = alg; 11 | this.maxKeyLength = maxKeyLength; 12 | } 13 | 14 | public AuthTotpDetails(String alg) { 15 | this.alg = alg; 16 | this.maxKeyLength = 6; 17 | } 18 | 19 | @Override 20 | public String getType() { 21 | return "totp"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/details/AuthWebViewDetails.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.details; 2 | 3 | import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent; 4 | 5 | public class AuthWebViewDetails implements GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails { 6 | public final String url; 7 | public final String redirectUrl; 8 | public final boolean canBrowser; 9 | public final boolean onlyBrowser; 10 | 11 | public AuthWebViewDetails(String url, String redirectUrl, boolean canBrowser, boolean onlyBrowser) { 12 | this.url = url; 13 | this.redirectUrl = redirectUrl; 14 | this.canBrowser = canBrowser; 15 | this.onlyBrowser = onlyBrowser; 16 | } 17 | 18 | public AuthWebViewDetails(String url, String redirectUrl) { 19 | this.url = url; 20 | this.redirectUrl = redirectUrl; 21 | this.canBrowser = true; 22 | this.onlyBrowser = false; 23 | } 24 | 25 | @Override 26 | public String getType() { 27 | return "webview"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/Auth2FAPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class Auth2FAPassword implements AuthRequest.AuthPasswordInterface { 6 | public AuthRequest.AuthPasswordInterface firstPassword; 7 | public AuthRequest.AuthPasswordInterface secondPassword; 8 | 9 | @Override 10 | public boolean check() { 11 | return firstPassword != null && firstPassword.check() && secondPassword != null && secondPassword.check(); 12 | } 13 | 14 | @Override 15 | public boolean isAllowSave() { 16 | return firstPassword.isAllowSave() && secondPassword.isAllowSave(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthAESPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.request.auth.AuthRequest; 5 | 6 | public class AuthAESPassword implements AuthRequest.AuthPasswordInterface { 7 | @LauncherNetworkAPI 8 | public final byte[] password; 9 | 10 | public AuthAESPassword(byte[] aesEncryptedPassword) { 11 | this.password = aesEncryptedPassword; 12 | } 13 | 14 | @Override 15 | public boolean check() { 16 | return true; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthCodePassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class AuthCodePassword implements AuthRequest.AuthPasswordInterface { 6 | public final String uri; 7 | 8 | public AuthCodePassword(String uri) { 9 | this.uri = uri; 10 | } 11 | 12 | @Override 13 | public boolean check() { 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthMultiPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | import java.util.List; 6 | 7 | public class AuthMultiPassword implements AuthRequest.AuthPasswordInterface { 8 | public List list; 9 | 10 | @Override 11 | public boolean check() { 12 | return list != null && list.stream().allMatch(l -> l != null && l.check()); 13 | } 14 | 15 | @Override 16 | public boolean isAllowSave() { 17 | return list != null && list.stream().allMatch(l -> l != null && l.isAllowSave()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthOAuthPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class AuthOAuthPassword implements AuthRequest.AuthPasswordInterface { 6 | public final String accessToken; 7 | public final String refreshToken; 8 | public final int expire; 9 | 10 | public AuthOAuthPassword(String accessToken, String refreshToken, int expire) { 11 | this.accessToken = accessToken; 12 | this.refreshToken = refreshToken; 13 | this.expire = expire; 14 | } 15 | 16 | public AuthOAuthPassword(String accessToken, int expire) { 17 | this.accessToken = accessToken; 18 | this.refreshToken = null; 19 | this.expire = expire; 20 | } 21 | 22 | public AuthOAuthPassword(String accessToken) { 23 | this.accessToken = accessToken; 24 | this.refreshToken = null; 25 | this.expire = 0; 26 | } 27 | 28 | @Override 29 | public boolean check() { 30 | return true; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthPlainPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.request.auth.AuthRequest; 5 | 6 | public class AuthPlainPassword implements AuthRequest.AuthPasswordInterface { 7 | @LauncherNetworkAPI 8 | public final String password; 9 | 10 | public AuthPlainPassword(String password) { 11 | this.password = password; 12 | } 13 | 14 | @Override 15 | public boolean check() { 16 | return true; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthRSAPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class AuthRSAPassword implements AuthRequest.AuthPasswordInterface { 6 | public final byte[] password; 7 | 8 | public AuthRSAPassword(byte[] rsaEncryptedPassword) { 9 | this.password = rsaEncryptedPassword; 10 | } 11 | 12 | @Override 13 | public boolean check() { 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthSignaturePassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class AuthSignaturePassword implements AuthRequest.AuthPasswordInterface { 6 | public byte[] signature; 7 | public byte[] publicKey; 8 | public byte[] salt; 9 | 10 | public AuthSignaturePassword(byte[] signature, byte[] publicKey, byte[] salt) { 11 | this.signature = signature; 12 | this.publicKey = publicKey; 13 | this.salt = salt; 14 | } 15 | 16 | @Override 17 | public boolean check() { 18 | return true; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/auth/password/AuthTOTPPassword.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.auth.password; 2 | 3 | import pro.gravit.launcher.base.request.auth.AuthRequest; 4 | 5 | public class AuthTOTPPassword implements AuthRequest.AuthPasswordInterface { 6 | public String totp; 7 | 8 | @Override 9 | public boolean check() { 10 | return true; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/cabinet/AssetUploadInfoRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.cabinet; 2 | 3 | import pro.gravit.launcher.base.events.request.AssetUploadInfoRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class AssetUploadInfoRequest extends Request { 7 | @Override 8 | public String getType() { 9 | return "assetUploadInfo"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/cabinet/GetAssetUploadUrl.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.cabinet; 2 | 3 | import pro.gravit.launcher.base.events.request.GetAssetUploadUrlRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class GetAssetUploadUrl extends Request { 7 | public String name; 8 | 9 | public GetAssetUploadUrl() { 10 | } 11 | 12 | public GetAssetUploadUrl(String name) { 13 | this.name = name; 14 | } 15 | 16 | @Override 17 | public String getType() { 18 | return "getAssetUploadUrl"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/management/FeaturesRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.management; 2 | 3 | import pro.gravit.launcher.base.events.request.FeaturesRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class FeaturesRequest extends Request { 7 | @Override 8 | public String getType() { 9 | return "features"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/management/GetConnectUUIDRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.management; 2 | 3 | import pro.gravit.launcher.base.events.request.GetConnectUUIDRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class GetConnectUUIDRequest extends Request { 7 | @Override 8 | public String getType() { 9 | return "getConnectUUID"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/secure/GetSecureLevelInfoRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.secure; 2 | 3 | import pro.gravit.launcher.base.events.request.GetSecureLevelInfoRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class GetSecureLevelInfoRequest extends Request { 7 | @Override 8 | public String getType() { 9 | return "getSecureLevelInfo"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/secure/VerifySecureLevelKeyRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.secure; 2 | 3 | import pro.gravit.launcher.base.events.request.VerifySecureLevelKeyRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | 6 | public class VerifySecureLevelKeyRequest extends Request { 7 | public final byte[] publicKey; 8 | public final byte[] signature; 9 | 10 | public VerifySecureLevelKeyRequest(byte[] publicKey, byte[] signature) { 11 | this.publicKey = publicKey; 12 | this.signature = signature; 13 | } 14 | 15 | @Override 16 | public String getType() { 17 | return "verifySecureLevelKey"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/update/ProfilesRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.update; 2 | 3 | import pro.gravit.launcher.base.events.request.ProfilesRequestEvent; 4 | import pro.gravit.launcher.base.request.Request; 5 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 6 | 7 | public final class ProfilesRequest extends Request implements WebSocketRequest { 8 | 9 | @Override 10 | public String getType() { 11 | return "profiles"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/update/UpdateRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.update; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.request.UpdateRequestEvent; 5 | import pro.gravit.launcher.base.request.Request; 6 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 7 | 8 | public final class UpdateRequest extends Request implements WebSocketRequest { 9 | 10 | // Instance 11 | @LauncherNetworkAPI 12 | public final String dirName; 13 | 14 | public UpdateRequest(String dirName) { 15 | this.dirName = dirName; 16 | } 17 | 18 | @Override 19 | public String getType() { 20 | return "update"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/uuid/ProfileByUUIDRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.uuid; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.request.ProfileByUUIDRequestEvent; 5 | import pro.gravit.launcher.base.request.Request; 6 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 7 | 8 | import java.util.Objects; 9 | import java.util.UUID; 10 | 11 | public final class ProfileByUUIDRequest extends Request implements WebSocketRequest { 12 | @LauncherNetworkAPI 13 | public final UUID uuid; 14 | 15 | 16 | public ProfileByUUIDRequest(UUID uuid) { 17 | this.uuid = Objects.requireNonNull(uuid, "uuid"); 18 | } 19 | 20 | @Override 21 | public String getType() { 22 | return "profileByUUID"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/uuid/ProfileByUsernameRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.uuid; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.base.events.request.ProfileByUsernameRequestEvent; 5 | import pro.gravit.launcher.base.request.Request; 6 | import pro.gravit.launcher.base.request.websockets.WebSocketRequest; 7 | 8 | public final class ProfileByUsernameRequest extends Request implements WebSocketRequest { 9 | @LauncherNetworkAPI 10 | public final String username; 11 | 12 | 13 | public ProfileByUsernameRequest(String username) { 14 | this.username = username; 15 | } 16 | 17 | @Override 18 | public String getType() { 19 | return "profileByUsername"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LauncherAPI/src/main/java/pro/gravit/launcher/base/request/websockets/WebSocketRequest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.base.request.websockets; 2 | 3 | import pro.gravit.utils.TypeSerializeInterface; 4 | 5 | public interface WebSocketRequest extends TypeSerializeInterface { 6 | String getType(); 7 | } 8 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/Cyclic2DependModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.utils.Version; 7 | 8 | public class Cyclic2DependModule extends LauncherModule { 9 | public Cyclic2DependModule() { 10 | super(new LauncherModuleInfo("cyclic2", 11 | new Version(1, 0, 0), 12 | 2, new String[]{"cyclic1"})); 13 | } 14 | 15 | @Override 16 | public void init(LauncherInitContext initContext) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/CyclicDependModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.utils.Version; 7 | 8 | public class CyclicDependModule extends LauncherModule { 9 | public CyclicDependModule() { 10 | super(new LauncherModuleInfo("cyclic1", 11 | new Version(1, 0, 0), 12 | 2, new String[]{"cyclic2"})); 13 | } 14 | 15 | @Override 16 | public void init(LauncherInitContext initContext) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/Depend1Module.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import pro.gravit.launcher.base.modules.LauncherInitContext; 5 | import pro.gravit.launcher.base.modules.LauncherModule; 6 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 7 | import pro.gravit.utils.Version; 8 | 9 | public class Depend1Module extends LauncherModule { 10 | public Depend1Module() { 11 | super(new LauncherModuleInfo("depend1", new Version(1, 0, 0), 12 | 0, 13 | new String[]{"depend3", "internal", "virtual"})); 14 | } 15 | 16 | @Override 17 | public void init(LauncherInitContext initContext) { 18 | InternalModule module = modulesManager.getModule(InternalModule.class); 19 | Assertions.assertEquals(InitStatus.FINISH, module.getInitStatus()); 20 | Depend3Module module1 = modulesManager.getModule(Depend3Module.class); 21 | Assertions.assertEquals(InitStatus.FINISH, module1.getInitStatus()); 22 | VirtualInterface virtualInterface = modulesManager.getModuleByInterface(VirtualInterface.class); 23 | Assertions.assertEquals(InitStatus.FINISH, ((LauncherModule) virtualInterface).getInitStatus()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/Depend2Module.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import pro.gravit.launcher.base.modules.LauncherInitContext; 5 | import pro.gravit.launcher.base.modules.LauncherModule; 6 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 7 | import pro.gravit.utils.Version; 8 | 9 | public class Depend2Module extends LauncherModule { 10 | public Depend2Module() { 11 | super(new LauncherModuleInfo("depend2")); 12 | } 13 | 14 | @Override 15 | public void preInitAction() { 16 | modulesManager.loadModule(new InternalModule()); 17 | modulesManager.loadModule(new ProvidedModule()); 18 | } 19 | 20 | @Override 21 | public void init(LauncherInitContext initContext) { 22 | requireModule("depend1", new Version(1, 0, 0)); 23 | try { 24 | requireModule("dependNotFound", new Version(1, 0, 0)); 25 | Assertions.fail("dependNotFound"); 26 | } catch (RuntimeException ignored) { 27 | 28 | } 29 | try { 30 | requireModule("depend1", new Version(10, 0, 0)); 31 | Assertions.fail("depend1 high version"); 32 | } catch (RuntimeException ignored) { 33 | 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/Depend3Module.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | 7 | public class Depend3Module extends LauncherModule { 8 | public Depend3Module() { 9 | super(new LauncherModuleInfo("depend3")); 10 | } 11 | 12 | @Override 13 | public void init(LauncherInitContext initContext) { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/InternalModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | 7 | public class InternalModule extends LauncherModule { 8 | public InternalModule() { 9 | super(new LauncherModuleInfo("internal")); 10 | } 11 | 12 | @Override 13 | public void init(LauncherInitContext initContext) { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/MainModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import pro.gravit.launcher.base.modules.LauncherInitContext; 5 | import pro.gravit.launcher.base.modules.LauncherModule; 6 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 7 | import pro.gravit.utils.Version; 8 | 9 | public class MainModule extends LauncherModule { 10 | 11 | public MainModule() { 12 | super(new LauncherModuleInfo("main", 13 | new Version(1, 0, 0), 14 | 0, new String[]{"depend1", "depend2"})); 15 | } 16 | 17 | @Override 18 | public void init(LauncherInitContext initContext) { 19 | Depend1Module module = modulesManager.getModule(Depend1Module.class); 20 | Assertions.assertEquals(InitStatus.FINISH, module.getInitStatus()); 21 | Depend2Module module2 = modulesManager.getModule(Depend2Module.class); 22 | Assertions.assertEquals(InitStatus.FINISH, module2.getInitStatus()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/ProvidedModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.utils.Version; 7 | 8 | public class ProvidedModule extends LauncherModule implements VirtualInterface { 9 | public ProvidedModule() { 10 | super(new LauncherModuleInfo("provided", new Version(1, 0, 0), 11 | 0, new String[]{}, new String[]{"virtual"})); 12 | } 13 | 14 | @Override 15 | public void init(LauncherInitContext initContext) { 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/TestModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.launcher.impl.event.CancelEvent; 4 | import pro.gravit.launcher.impl.event.NormalEvent; 5 | import pro.gravit.launcher.base.modules.LauncherInitContext; 6 | import pro.gravit.launcher.base.modules.LauncherModule; 7 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 8 | 9 | public class TestModule extends LauncherModule { 10 | 11 | public TestModule() { 12 | super(new LauncherModuleInfo("testModule")); 13 | } 14 | 15 | @Override 16 | public void init(LauncherInitContext initContext) { 17 | registerEvent(this::testevent, NormalEvent.class); 18 | registerEvent(this::testevent2, CancelEvent.class); 19 | } 20 | 21 | public void testevent(NormalEvent event) { 22 | event.passed = true; 23 | } 24 | 25 | public void testevent2(CancelEvent cancelEvent) { 26 | cancelEvent.cancel(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/VirtualInterface.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | public interface VirtualInterface { 4 | } 5 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/event/CancelEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl.event; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class CancelEvent extends LauncherModule.Event { 6 | } 7 | -------------------------------------------------------------------------------- /LauncherAPI/src/test/java/pro/gravit/launcher/impl/event/NormalEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl.event; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | 5 | public class NormalEvent extends LauncherModule.Event { 6 | public boolean passed; 7 | } 8 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/ClientGsonManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client; 2 | 3 | import com.google.gson.GsonBuilder; 4 | import pro.gravit.launcher.core.managers.GsonManager; 5 | import pro.gravit.launcher.base.modules.events.PreGsonPhase; 6 | import pro.gravit.launcher.base.request.websockets.ClientWebSocketService; 7 | 8 | public class ClientGsonManager extends GsonManager { 9 | private final ClientModuleManager moduleManager; 10 | 11 | public ClientGsonManager(ClientModuleManager moduleManager) { 12 | this.moduleManager = moduleManager; 13 | } 14 | 15 | @Override 16 | public void registerAdapters(GsonBuilder builder) { 17 | super.registerAdapters(builder); 18 | ClientWebSocketService.appendTypeAdapters(builder); 19 | moduleManager.invokeEvent(new PreGsonPhase(builder)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/ClientLauncherCoreModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.utils.Version; 7 | 8 | public class ClientLauncherCoreModule extends LauncherModule { 9 | public ClientLauncherCoreModule() { 10 | super(new LauncherModuleInfo("ClientLauncherCore", Version.getVersion())); 11 | } 12 | 13 | @Override 14 | public void init(LauncherInitContext initContext) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/RuntimeLauncherCoreModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherInitContext; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.modules.LauncherModuleInfo; 6 | import pro.gravit.utils.Version; 7 | 8 | public class RuntimeLauncherCoreModule extends LauncherModule { 9 | public RuntimeLauncherCoreModule() { 10 | super(new LauncherModuleInfo("ClientLauncherCore", Version.getVersion())); 11 | } 12 | 13 | @Override 14 | public void init(LauncherInitContext initContext) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/api/SystemService.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.api; 2 | 3 | import pro.gravit.launcher.client.ClientLauncherMethods; 4 | 5 | public class SystemService { 6 | private SystemService() { 7 | throw new UnsupportedOperationException(); 8 | } 9 | 10 | public static void exit(int code) { 11 | ClientLauncherMethods.exitLauncher(code); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientExitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.base.modules.events.ClosePhase; 4 | 5 | public class ClientExitPhase extends ClosePhase { 6 | public final int code; 7 | 8 | public ClientExitPhase(int code) { 9 | this.code = code; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientProcessClassLoaderEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.launcher.base.profiles.ClientProfile; 5 | import pro.gravit.utils.launch.ClassLoaderControl; 6 | import pro.gravit.utils.launch.Launch; 7 | 8 | public class ClientProcessClassLoaderEvent extends LauncherModule.Event { 9 | public final Launch launch; 10 | public final ClassLoaderControl classLoaderControl; 11 | public final ClientProfile profile; 12 | 13 | public ClientProcessClassLoaderEvent(Launch launch, ClassLoaderControl classLoaderControl, ClientProfile profile) { 14 | this.launch = launch; 15 | this.classLoaderControl = classLoaderControl; 16 | this.profile = profile; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientProcessInitPhase.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.client.ClientParams; 4 | import pro.gravit.launcher.base.modules.events.InitPhase; 5 | 6 | public class ClientProcessInitPhase extends InitPhase { 7 | public final ClientParams params; 8 | 9 | public ClientProcessInitPhase(ClientParams params) { 10 | this.params = params; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientProcessLaunchEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.client.ClientParams; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | 6 | public class ClientProcessLaunchEvent extends LauncherModule.Event { 7 | public final ClientParams params; 8 | 9 | public ClientProcessLaunchEvent(ClientParams params) { 10 | this.params = params; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientProcessPreInvokeMainClassEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.client.ClientParams; 4 | import pro.gravit.launcher.base.modules.LauncherModule; 5 | import pro.gravit.launcher.base.profiles.ClientProfile; 6 | 7 | import java.util.Collection; 8 | 9 | public class ClientProcessPreInvokeMainClassEvent extends LauncherModule.Event { 10 | public final ClientParams params; 11 | public final ClientProfile profile; 12 | public final Collection args; 13 | 14 | public ClientProcessPreInvokeMainClassEvent(ClientParams params, ClientProfile profile, Collection args) { 15 | this.params = params; 16 | this.profile = profile; 17 | this.args = args; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientProcessReadyEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.client.ClientParams; 4 | import pro.gravit.launcher.base.modules.events.PostInitPhase; 5 | 6 | public class ClientProcessReadyEvent extends PostInitPhase { 7 | public final ClientParams params; 8 | 9 | public ClientProcessReadyEvent(ClientParams params) { 10 | this.params = params; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/events/ClientUnlockConsoleEvent.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.events; 2 | 3 | import pro.gravit.launcher.base.modules.LauncherModule; 4 | import pro.gravit.utils.command.CommandHandler; 5 | 6 | public class ClientUnlockConsoleEvent extends LauncherModule.Event { 7 | public final CommandHandler handler; 8 | 9 | public ClientUnlockConsoleEvent(CommandHandler handler) { 10 | this.handler = handler; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/utils/ApiBridgeService.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.utils; 2 | 3 | import pro.gravit.launcher.base.Launcher; 4 | import pro.gravit.launcher.core.LauncherTrustManager; 5 | 6 | import java.security.cert.X509Certificate; 7 | 8 | public class ApiBridgeService { 9 | public static LauncherTrustManager.CheckClassResult checkCertificates(X509Certificate[] certs) { 10 | LauncherTrustManager trustManager = Launcher.getConfig().trustManager; 11 | return trustManager.checkCertificates(certs, trustManager::stdCertificateChecker); 12 | } 13 | 14 | public static void checkCertificatesSuccess(X509Certificate[] certs) throws Exception { 15 | LauncherTrustManager trustManager = Launcher.getConfig().trustManager; 16 | trustManager.checkCertificatesSuccess(certs, trustManager::stdCertificateChecker); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /LauncherClient/src/main/java/pro/gravit/launcher/client/utils/NativeJVMHalt.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.client.utils; 2 | 3 | import pro.gravit.utils.helper.LogHelper; 4 | 5 | import java.lang.reflect.Method; 6 | 7 | public final class NativeJVMHalt { 8 | public final int haltCode; 9 | 10 | public NativeJVMHalt(int haltCode) { 11 | this.haltCode = haltCode; 12 | System.out.println("JVM exit code " + haltCode); 13 | } 14 | 15 | public static void initFunc() { 16 | 17 | } 18 | 19 | public static void haltA(int code) { 20 | NativeJVMHalt halt = new NativeJVMHalt(code); 21 | try { 22 | LogHelper.dev("Try invoke Shutdown.exit"); 23 | Class clazz = Class.forName("java.lang.Shutdown", true, ClassLoader.getSystemClassLoader()); 24 | Method exitMethod = clazz.getDeclaredMethod("exit", int.class); 25 | exitMethod.setAccessible(true); 26 | exitMethod.invoke(null, code); 27 | } catch (Throwable e) { 28 | if (LogHelper.isDevEnabled()) { 29 | LogHelper.error(e); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/LauncherInject.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.Target; 5 | 6 | import static java.lang.annotation.ElementType.FIELD; 7 | import static java.lang.annotation.RetentionPolicy.CLASS; 8 | 9 | @Retention(CLASS) 10 | @Target(FIELD) 11 | public @interface LauncherInject { 12 | String value(); // target of inject 13 | 14 | } 15 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/LauncherInjectionConstructor.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.Target; 5 | 6 | import static java.lang.annotation.ElementType.CONSTRUCTOR; 7 | import static java.lang.annotation.RetentionPolicy.CLASS; 8 | 9 | @Retention(CLASS) 10 | @Target(CONSTRUCTOR) 11 | public @interface LauncherInjectionConstructor { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/LauncherNetworkAPI.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * This annotation implies that method/field/class should not be renamed or obfuscated 10 | * It is used for classes and fields serializable with the help of GSON to save the field name during transmission over the network. 11 | */ 12 | @Retention(RetentionPolicy.CLASS) 13 | @Target({ElementType.TYPE, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.METHOD}) 14 | public @interface LauncherNetworkAPI { 15 | } 16 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/hasher/HashedEntry.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core.hasher; 2 | 3 | import pro.gravit.launcher.core.LauncherNetworkAPI; 4 | import pro.gravit.launcher.core.serialize.HInput; 5 | import pro.gravit.launcher.core.serialize.stream.EnumSerializer; 6 | import pro.gravit.launcher.core.serialize.stream.StreamObject; 7 | 8 | import java.io.IOException; 9 | 10 | public abstract class HashedEntry extends StreamObject { 11 | 12 | @LauncherNetworkAPI 13 | public boolean flag; // For external usage 14 | 15 | public abstract Type getType(); 16 | 17 | public abstract long size(); 18 | 19 | 20 | public enum Type implements EnumSerializer.Itf { 21 | DIR(1), FILE(2); 22 | private static final EnumSerializer SERIALIZER = new EnumSerializer<>(Type.class); 23 | private final int n; 24 | 25 | Type(int n) { 26 | this.n = n; 27 | } 28 | 29 | public static Type read(HInput input) throws IOException { 30 | return SERIALIZER.read(input); 31 | } 32 | 33 | @Override 34 | public int getNumber() { 35 | return n; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/serialize/stream/EnumSerializer.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core.serialize.stream; 2 | 3 | import pro.gravit.launcher.core.serialize.HInput; 4 | import pro.gravit.launcher.core.serialize.HOutput; 5 | import pro.gravit.launcher.core.serialize.stream.EnumSerializer.Itf; 6 | import pro.gravit.utils.helper.VerifyHelper; 7 | 8 | import java.io.IOException; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | public final class EnumSerializer & Itf> { 13 | private final Map map = new HashMap<>(16); 14 | 15 | 16 | public EnumSerializer(Class clazz) { 17 | for (E e : clazz.getEnumConstants()) 18 | VerifyHelper.putIfAbsent(map, e.getNumber(), e, "Duplicate number for enum constant " + e.name()); 19 | } 20 | 21 | public static void write(HOutput output, Itf itf) throws IOException { 22 | output.writeVarInt(itf.getNumber()); 23 | } 24 | 25 | public E read(HInput input) throws IOException { 26 | int n = input.readVarInt(); 27 | return VerifyHelper.getMapValue(map, n, "Unknown enum number: " + n); 28 | } 29 | 30 | 31 | @FunctionalInterface 32 | public interface Itf { 33 | 34 | int getNumber(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/launcher/core/serialize/stream/StreamObject.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.core.serialize.stream; 2 | 3 | import pro.gravit.launcher.core.serialize.HInput; 4 | import pro.gravit.launcher.core.serialize.HOutput; 5 | import pro.gravit.utils.helper.IOHelper; 6 | 7 | import java.io.ByteArrayOutputStream; 8 | import java.io.IOException; 9 | 10 | public abstract class StreamObject { 11 | /* public StreamObject(HInput input) */ 12 | 13 | public final byte[] write() throws IOException { 14 | try (ByteArrayOutputStream array = IOHelper.newByteArrayOutput()) { 15 | try (HOutput output = new HOutput(array)) { 16 | write(output); 17 | } 18 | return array.toByteArray(); 19 | } 20 | } 21 | 22 | public abstract void write(HOutput output) throws IOException; 23 | 24 | 25 | @FunctionalInterface 26 | public interface Adapter { 27 | 28 | O convert(HInput input); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/HookException.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils; 2 | 3 | public class HookException extends RuntimeException { 4 | 5 | public HookException(String message) { 6 | super(message); 7 | } 8 | 9 | public HookException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | 13 | public HookException(Throwable cause) { 14 | super(cause); 15 | } 16 | 17 | public HookException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 18 | super(message, cause, enableSuppression, writableStackTrace); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/HookSet.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | public class HookSet { 7 | public final Set> list = new HashSet<>(); 8 | 9 | public void registerHook(Hook hook) { 10 | list.add(hook); 11 | } 12 | 13 | public void unregisterHook(Hook hook) { 14 | list.remove(hook); 15 | } 16 | 17 | /** 18 | * @param context custom param 19 | * @return True if hook to interrupt processing 20 | * False to continue 21 | * @throws HookException The hook may return the error text throwing this exception 22 | */ 23 | public boolean hook(R context) throws HookException { 24 | for (Hook hook : list) { 25 | if (hook.hook(context)) return true; 26 | } 27 | return false; 28 | } 29 | 30 | @FunctionalInterface 31 | public interface Hook { 32 | /** 33 | * @param context custom param 34 | * @return True if you need to interrupt hook processing 35 | * False to continue processing hook 36 | * @throws HookException The hook may return the error text throwing this exception 37 | */ 38 | boolean hook(R context) throws HookException; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/TypeSerializeInterface.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils; 2 | 3 | public interface TypeSerializeInterface { 4 | String getType(); 5 | } 6 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/BaseCommandCategory.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command; 2 | 3 | import pro.gravit.utils.helper.VerifyHelper; 4 | 5 | import java.util.Map; 6 | import java.util.Objects; 7 | import java.util.concurrent.ConcurrentHashMap; 8 | 9 | public class BaseCommandCategory implements CommandCategory { 10 | private final Map commands = new ConcurrentHashMap<>(32); 11 | 12 | @Override 13 | public void registerCommand(String name, Command command) { 14 | VerifyHelper.verifyIDName(name); 15 | VerifyHelper.putIfAbsent(commands, name.toLowerCase(), Objects.requireNonNull(command, "command"), 16 | String.format("Command has been already registered: '%s'", name.toLowerCase())); 17 | } 18 | 19 | @Override 20 | public Command unregisterCommand(String name) { 21 | return commands.remove(name); 22 | } 23 | 24 | @Override 25 | public Command findCommand(String name) { 26 | return commands.get(name); 27 | } 28 | 29 | @Override 30 | public Map commandsMap() { 31 | return commands; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/CommandCategory.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command; 2 | 3 | import java.util.Map; 4 | 5 | public interface CommandCategory { 6 | void registerCommand(String name, Command command); 7 | 8 | Command unregisterCommand(String name); 9 | 10 | Command findCommand(String name); 11 | 12 | Map commandsMap(); 13 | } 14 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/CommandException.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command; 2 | 3 | public final class CommandException extends Exception { 4 | 5 | 6 | public CommandException(String message) { 7 | super(message, null, false, false); 8 | } 9 | 10 | 11 | public CommandException(Throwable exc) { 12 | super(exc); 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return getMessage(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/SubCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command; 2 | 3 | public abstract class SubCommand extends Command { 4 | private String defaultArgs; 5 | private String defaultUsage; 6 | 7 | public SubCommand() { 8 | } 9 | 10 | public SubCommand(String defaultArgs, String defaultUsage) { 11 | this.defaultArgs = defaultArgs; 12 | this.defaultUsage = defaultUsage; 13 | } 14 | 15 | @Override 16 | public String getArgsDescription() { 17 | return defaultArgs; 18 | } 19 | 20 | @Override 21 | public String getUsageDescription() { 22 | return defaultUsage; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/basic/ClearCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command.basic; 2 | 3 | import pro.gravit.utils.command.Command; 4 | import pro.gravit.utils.command.CommandHandler; 5 | import pro.gravit.utils.helper.LogHelper; 6 | 7 | public final class ClearCommand extends Command { 8 | private final CommandHandler handler; 9 | 10 | public ClearCommand(CommandHandler handler) { 11 | this.handler = handler; 12 | } 13 | 14 | @Override 15 | public String getArgsDescription() { 16 | return null; 17 | } 18 | 19 | @Override 20 | public String getUsageDescription() { 21 | return "Clear terminal"; 22 | } 23 | 24 | @Override 25 | public void invoke(String... args) throws Exception { 26 | handler.clear(); 27 | LogHelper.subInfo("Terminal cleared"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/basic/DebugCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command.basic; 2 | 3 | import pro.gravit.utils.command.Command; 4 | import pro.gravit.utils.helper.LogHelper; 5 | 6 | public class DebugCommand extends Command { 7 | @Override 8 | public String getArgsDescription() { 9 | return "[true/false] [true/false]"; 10 | } 11 | 12 | @Override 13 | public String getUsageDescription() { 14 | return null; 15 | } 16 | 17 | @Override 18 | public void invoke(String... args) { 19 | boolean newValue, newTraceValue; 20 | if (args.length >= 1) { 21 | newValue = Boolean.parseBoolean(args[0]); 22 | if (args.length >= 2) newTraceValue = Boolean.parseBoolean(args[1]); 23 | else newTraceValue = newValue; 24 | LogHelper.setDebugEnabled(newValue); 25 | LogHelper.setStacktraceEnabled(newTraceValue); 26 | } else { 27 | newValue = LogHelper.isDebugEnabled(); 28 | newTraceValue = LogHelper.isStacktraceEnabled(); 29 | } 30 | LogHelper.subInfo("Debug enabled: " + newValue); 31 | LogHelper.subInfo("Stacktrace enabled: " + newTraceValue); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/command/basic/GCCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.command.basic; 2 | 3 | import pro.gravit.utils.command.Command; 4 | import pro.gravit.utils.helper.JVMHelper; 5 | import pro.gravit.utils.helper.LogHelper; 6 | 7 | public class GCCommand extends Command { 8 | @Override 9 | public String getArgsDescription() { 10 | return null; 11 | } 12 | 13 | @Override 14 | public String getUsageDescription() { 15 | return null; 16 | } 17 | 18 | @Override 19 | public void invoke(String... args) { 20 | LogHelper.subInfo("Performing full GC"); 21 | JVMHelper.fullGC(); 22 | // Print memory usage 23 | long max = JVMHelper.RUNTIME.maxMemory() >> 20; 24 | long free = JVMHelper.RUNTIME.freeMemory() >> 20; 25 | long total = JVMHelper.RUNTIME.totalMemory() >> 20; 26 | long used = total - free; 27 | LogHelper.subInfo("Heap usage: %d / %d / %d MiB", used, total, max); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/helper/EnvHelper.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.helper; 2 | 3 | import java.util.Locale; 4 | import java.util.Map; 5 | 6 | public final class EnvHelper { 7 | public static final String[] toTest = {"_JAVA_OPTIONS", "_JAVA_OPTS", "JAVA_OPTS", "JAVA_OPTIONS"}; 8 | 9 | public static void addEnv(ProcessBuilder builder) { 10 | Map map = builder.environment(); 11 | for (String env : toTest) { 12 | if (map.containsKey(env)) 13 | map.put(env, ""); 14 | String lower_env = env.toLowerCase(Locale.US); 15 | if (map.containsKey(lower_env)) 16 | map.put(lower_env, ""); 17 | } 18 | } 19 | 20 | public static void checkDangerousParams() { 21 | for (String t : toTest) { 22 | String env = System.getenv(t); 23 | if (env != null) { 24 | env = env.toLowerCase(Locale.US); 25 | if (env.contains("-cp") || env.contains("-classpath") || env.contains("-javaagent") 26 | || env.contains("-agentpath") || env.contains("-agentlib")) 27 | throw new SecurityException("JavaAgent in global options not allow"); 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/helper/QueryHelper.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.helper; 2 | 3 | import java.net.URI; 4 | import java.net.URLDecoder; 5 | import java.net.URLEncoder; 6 | import java.nio.charset.StandardCharsets; 7 | import java.util.*; 8 | 9 | public class QueryHelper { 10 | public static Map> splitUriQuery(URI uri) { 11 | var query = uri.getRawQuery(); 12 | if (query == null) { 13 | return Collections.emptyMap(); 14 | } 15 | Map> params = new HashMap<>(); 16 | String[] split = query.split("&"); 17 | for (String qParams : split) { 18 | String[] splitParams = qParams.split("="); 19 | List strings = params.computeIfAbsent(URLDecoder.decode(splitParams[0], StandardCharsets.UTF_8), 20 | k -> new ArrayList<>(1)); 21 | strings.add(URLDecoder.decode(splitParams[1], StandardCharsets.UTF_8)); 22 | } 23 | return params; 24 | } 25 | 26 | public static String encodeFormPair(String key, String value) { 27 | return URLEncoder.encode(key, StandardCharsets.UTF_8) + "=" + URLEncoder.encode(value, StandardCharsets.UTF_8); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/launch/ClassLoaderControl.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.launch; 2 | 3 | import java.lang.invoke.MethodHandles; 4 | import java.net.URL; 5 | import java.nio.file.Path; 6 | import java.security.ProtectionDomain; 7 | 8 | public interface ClassLoaderControl { 9 | void addLauncherPackage(String prefix); 10 | void clearLauncherPackages(); 11 | void addTransformer(ClassTransformer transformer); 12 | void addURL(URL url); 13 | void addJar(Path path); 14 | URL[] getURLs(); 15 | 16 | Class getClass(String name) throws ClassNotFoundException; 17 | 18 | ClassLoader getClassLoader(); 19 | 20 | Object getJava9ModuleController(); 21 | 22 | MethodHandles.Lookup getHackLookup(); 23 | interface ClassTransformer { 24 | boolean filter(String moduleName, String name); 25 | byte[] transform(String moduleName, String name, ProtectionDomain protectionDomain, byte[] data); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/launch/Launch.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.launch; 2 | 3 | import java.nio.file.Path; 4 | import java.util.Collection; 5 | import java.util.List; 6 | 7 | public interface Launch { 8 | ClassLoaderControl init(List files, String nativePath, LaunchOptions options); 9 | void launch(String mainClass, String mainModule, Collection args) throws Throwable; 10 | } 11 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/launch/LaunchOptions.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.launch; 2 | 3 | import java.util.*; 4 | 5 | public class LaunchOptions { 6 | public boolean enableHacks; 7 | public boolean disablePackageDelegateSupport; 8 | public ModuleConf moduleConf; 9 | 10 | 11 | public static final class ModuleConf { 12 | public List modules = new ArrayList<>(); 13 | public List modulePath = new ArrayList<>(); 14 | public Map exports = new HashMap<>(); 15 | public Map opens = new HashMap<>(); 16 | public Map reads = new HashMap<>(); 17 | public List enableNativeAccess = new ArrayList<>(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/launch/ModuleHacks.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.launch; 2 | 3 | import java.lang.invoke.MethodHandles; 4 | import java.lang.invoke.MethodType; 5 | 6 | public class ModuleHacks { 7 | 8 | public static ModuleLayer.Controller createController(MethodHandles.Lookup lookup, ModuleLayer layer) { 9 | try { 10 | return (ModuleLayer.Controller) lookup.findConstructor(ModuleLayer.Controller.class, MethodType.methodType(void.class, ModuleLayer.class)).invoke(layer); 11 | } catch (Throwable e) { 12 | throw new RuntimeException(e); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LauncherCore/src/main/java/pro/gravit/utils/logging/LogHelperAppender.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.utils.logging; 2 | 3 | import pro.gravit.utils.helper.LogHelper; 4 | 5 | import java.util.function.Supplier; 6 | 7 | public interface LogHelperAppender { 8 | void log(LogHelper.Level level, String message, boolean sub); 9 | 10 | void logJAnsi(LogHelper.Level level, Supplier plaintext, Supplier jansitext, boolean sub); 11 | 12 | boolean isDebugEnabled(); 13 | 14 | void setDebugEnabled(boolean debugEnabled); 15 | 16 | boolean isStacktraceEnabled(); 17 | 18 | void setStacktraceEnabled(boolean stacktraceEnabled); 19 | 20 | boolean isDevEnabled(); 21 | 22 | void setDevEnabled(boolean stacktraceEnabled); 23 | 24 | void addOutput(LogHelper.OutputEnity output); 25 | 26 | boolean removeOutput(LogHelper.OutputEnity output); 27 | 28 | void printVersion(String product); 29 | 30 | void printLicense(String product); 31 | } 32 | -------------------------------------------------------------------------------- /LauncherCore/src/test/java/pro/gravit/launcher/VersionCompareTest.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import org.junit.jupiter.api.Test; 5 | import pro.gravit.utils.Version; 6 | 7 | 8 | public class VersionCompareTest { 9 | @Test 10 | public void compareTest() { 11 | Assertions.assertTrue(new Version(1, 0, 0).compareTo(new Version(1, 1, 0)) < 0); 12 | Assertions.assertTrue(new Version(1, 1, 0).compareTo(new Version(1, 0, 0)) > 0); 13 | Assertions.assertTrue(new Version(1, 0, 0).isLowerThan(new Version(1, 1, 0))); 14 | Assertions.assertTrue(new Version(1, 0, 1).isUpperThan(new Version(1, 0, 0))); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LauncherCore/src/test/java/pro/gravit/launcher/impl/Test2Command.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.utils.command.Command; 4 | 5 | public class Test2Command extends Command { 6 | @Override 7 | public String getArgsDescription() { 8 | return null; 9 | } 10 | 11 | @Override 12 | public String getUsageDescription() { 13 | return null; 14 | } 15 | 16 | @Override 17 | public void invoke(String... args) { 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /LauncherCore/src/test/java/pro/gravit/launcher/impl/TestCommand.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.impl; 2 | 3 | import pro.gravit.utils.command.Command; 4 | 5 | public class TestCommand extends Command { 6 | public boolean ok = true; 7 | 8 | @Override 9 | public String getArgsDescription() { 10 | return "TEST ARGS"; 11 | } 12 | 13 | @Override 14 | public String getUsageDescription() { 15 | return "TEST USAGE"; 16 | } 17 | 18 | @Override 19 | public void invoke(String... args) throws Exception { 20 | verifyArgs(args, 4); 21 | if (!args[0].equals("test1")) { 22 | throw new IllegalArgumentException(args[0]); 23 | } 24 | if (!args[1].equals("test 2")) { 25 | throw new IllegalArgumentException(args[1]); 26 | } 27 | if (!args[2].equals("test\" 3")) { 28 | throw new IllegalArgumentException(args[2]); 29 | } 30 | if (!args[3].equals("test\\ 4")) { 31 | throw new IllegalArgumentException(args[3]); 32 | } 33 | ok = true; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LauncherStart/src/main/java/pro/gravit/launcher/start/ClientWrapperModule.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.start; 2 | 3 | public interface ClientWrapperModule { 4 | void wrapperPhase(ClientLauncherWrapper.ClientLauncherWrapperContext context); 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Modification of the launcher sashok724's v3 from Gravit [![Build Status](https://travis-ci.com/GravitLauncher/Launcher.svg?branch=master)](https://travis-ci.com/GravitLauncher/Launcher) 2 | 3 | * [Discord channel](https://discord.gg/b9QG4ygY75) 4 | 5 | * [See license](LICENSE) 6 | * [See code of conduct](CODE_OF_CONDUCT.md) 7 | * [WIKI](https://gravitlauncher.com) 8 | * Get it (requires cURL): 9 | 10 | ```sh 11 | curl -s https://raw.githubusercontent.com/GravitLauncher/Launcher/master/get_it.sh | sh 12 | ``` -------------------------------------------------------------------------------- /ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapperGsonManager.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.server; 2 | 3 | import com.google.gson.GsonBuilder; 4 | import pro.gravit.launcher.core.managers.GsonManager; 5 | import pro.gravit.launcher.base.request.websockets.ClientWebSocketService; 6 | 7 | public class ServerWrapperGsonManager extends GsonManager { 8 | 9 | public ServerWrapperGsonManager() { 10 | } 11 | 12 | @Override 13 | public void registerAdapters(GsonBuilder builder) { 14 | super.registerAdapters(builder); 15 | ClientWebSocketService.appendTypeAdapters(builder); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapperInlineInitializer.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.server; 2 | 3 | public class ServerWrapperInlineInitializer { 4 | public static void run() throws Throwable { 5 | ServerWrapper.wrapper = new ServerWrapper(ServerWrapper.Config.class, ServerWrapper.configFile); 6 | ServerWrapper.wrapper.initialize(); 7 | ServerWrapper.wrapper.connect(); 8 | ServerWrapper.wrapper.runCompatClasses(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ServerWrapper/src/main/java/pro/gravit/launcher/server/authlib/LibrariesHashFileModifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.server.authlib; 2 | 3 | import java.io.IOException; 4 | 5 | @FunctionalInterface 6 | public interface LibrariesHashFileModifier { 7 | byte[] apply(byte[] data, InstallAuthlib.InstallAuthlibContext context) throws IOException; 8 | } 9 | -------------------------------------------------------------------------------- /ServerWrapper/src/main/java/pro/gravit/launcher/server/authlib/LibrariesLstModifier.java: -------------------------------------------------------------------------------- 1 | package pro.gravit.launcher.server.authlib; 2 | 3 | import pro.gravit.utils.helper.SecurityHelper; 4 | 5 | import java.nio.charset.StandardCharsets; 6 | 7 | public class LibrariesLstModifier implements LibrariesHashFileModifier { 8 | 9 | @Override 10 | public byte[] apply(byte[] data, InstallAuthlib.InstallAuthlibContext context) { 11 | String[] lines = new String(data).split("\n"); 12 | for(int i=0;i 12 | if (sub.name.endsWith('_module') || sub.name.endsWith('_swmodule') || sub.name.endsWith('_lmodule')) include 'modules:' + sub.name 13 | } 14 | --------------------------------------------------------------------------------