Compare commits

...

2864 commits

Author SHA1 Message Date
Gravita
e1ee1099cc Merge branch 'hotfix/5.6.16' 2025-06-21 20:00:49 +07:00
Gravita
b0e840a040 [FIX] ModuleConf resolve mudule path, not class path 2025-06-21 19:59:11 +07:00
Gravita
c76aae76a5 Merge branch 'release/5.6.15' 2025-05-25 12:28:59 +07:00
Gravita
261e16cecb [ANY] 5.6.15 stable 2025-05-25 12:19:02 +07:00
Antoni
3c9e009433
[ANY] Rename Proguard Libraries for release 2025-05-18 21:43:14 +03:00
Gravita
2379fe5798 [FIX] Enter serverName and address in console 2025-05-14 20:30:49 +07:00
Gravita
911ca1e69f [FIX] Duplicate classpath and modulepath entities 2025-05-04 22:03:28 +07:00
Gravita
90f74aaf25 [FEATURE] Build ServerWrapper inline jar 2025-05-04 21:54:51 +07:00
Gravita
880957fa9b [FEATURE] Support inline initialization in DebugMain 2025-05-04 21:18:03 +07:00
Gravita
2fea94071b [FEATURE] Support runCompatClasses in ServerWrapperInlineInitializer 2025-05-04 21:12:57 +07:00
Gravita
b41e8db336 [FEATURE] Add ServerWrapperInlineInitializer 2025-05-04 19:38:34 +07:00
Gravita
76570ddbe5 [FEATURE] Support directories in classpath in ServerWrapper 2025-05-04 19:02:46 +07:00
Gravita
3a160b8124 Merge tag 'v5.6.14' into dev
5.6.14 stable
2025-05-04 17:58:08 +07:00
Gravita
8fb1dc275c Merge branch 'release/5.6.14' 2025-05-04 17:57:55 +07:00
Gravita
95aed151e7 [ANY] 5.6.14 2025-05-04 17:57:46 +07:00
Gravita
6934c37a33 [FIX] Wrong if in clientType 2025-05-04 05:35:35 +07:00
Gravita
5155c470c6 Merge tag 'v5.6.13' into dev
5.6.13 stable release
2025-05-03 23:59:13 +07:00
Gravita
533dcfce14 Merge branch 'release/5.6.13' 2025-05-03 23:58:58 +07:00
Gravita
d2f83d81eb [ANY] 5.6.13 stable 2025-05-03 23:58:41 +07:00
Gravita
2379398c30 [ANY] Update gradle to 8.14 2025-05-03 23:26:34 +07:00
Gravita
f53c48a5ae [ANY] Update gradle 2025-05-03 23:24:30 +07:00
Gravita
394b64e22d Merge tag 'v5.6.12' into dev
5.6.12 stable release
2025-05-03 23:11:55 +07:00
Gravita
7c15742478 Merge branch 'release/5.6.12' 2025-05-03 23:11:40 +07:00
Gravita
d65fffade9 [ANY] 5.6.12 release 2025-05-03 23:11:33 +07:00
Gravita
bb6c95ca12 [FEATURE] Support multiple lwjgl3 versions 2025-05-03 22:43:06 +07:00
Gravita
9027987b29 [FEATURE] Support multiple client types 2025-05-03 22:31:04 +07:00
Gravita
d410533c8d [FEATURE][EXPERIMENTAL] Add javaargs.txt and java24args.txt 2025-04-25 18:04:16 +07:00
Gravita
af2c5c33e8 [FEATURE][EXPERIMENTAL] Usage Java modular system for start, change proguard libraries 2025-04-25 17:54:00 +07:00
Gravita
e67bb6a12f [FEATURE] Support /webapi/status endpoint for Docker 2025-04-25 14:58:02 +07:00
Gravita
e2e0ef6ea4 [FEATURE] Support enableNativeAccess, fix libraries modularity 2025-04-25 14:49:51 +07:00
Gravita
18419fcd3a [ANY] Update dependencies 2025-04-20 14:09:12 +07:00
Gravita
73804a555e Merge tag 'v5.6.11' into dev
5.6.11 stable
2025-04-05 10:03:51 +07:00
Gravita
b16281e04a Merge branch 'release/5.6.11' 2025-04-05 10:03:36 +07:00
Gravita
06f0bc873a [ANY] 5.6.11 stable 2025-04-05 10:00:34 +07:00
Gravita
834fbab12b [FIX] Java 24 dont support SecurityManager 2025-04-03 15:29:53 +07:00
Gravita
822872992f [FIX] Component proguard commands 2025-03-28 11:42:24 +07:00
Gravita
ac43034d45 [ANY] Update dependencies 2025-03-28 11:41:16 +07:00
Gravita
00446b40f0 [FIX] DiscordGameSDK library link 2025-03-19 18:16:45 +07:00
Gravita
9e29053afa [FEATURE] Setup support env configuration in ServerWrapper, fix compile 2025-02-24 19:47:41 +07:00
Gravita
2e93102106 [FEATURE] Add serverName to env configuration in ServerWrapper 2025-02-24 19:21:10 +07:00
Gravita
d4b69195b3 [FEATURE] Support env configuration in ServerWrapper 2025-02-24 19:18:49 +07:00
Gravita
a67fbac8bc [ANY] 5.6.11-dev 2025-02-24 15:19:34 +07:00
Gravita
a7abb9cbfc [ANY] IDEA code inspect 2025-02-24 15:19:09 +07:00
Gravita
689478ee0f Merge tag 'v5.6.10' into dev
5.6.10 stable
2025-02-24 14:35:09 +07:00
Gravita
df77a1ebd6 Merge branch 'release/5.6.10' 2025-02-24 14:34:51 +07:00
Gravita
641796b44e [ANY] 5.6.10 stable 2025-02-24 14:34:44 +07:00
Gravita
b7ed56b27e [ANY] Update Hikari 2025-02-24 14:30:41 +07:00
Gravita
f119bd4b30 [ANY] Delete not working modules 2025-02-19 11:51:51 +07:00
Gravita
bbff0eac64 [FEATURE] Support IO_URING mode in netty 2025-02-18 15:14:55 +07:00
Gravita
41f93b9f8d [ANY] Upgrade netty to 4.2.0.RC3 2025-02-18 14:56:16 +07:00
Gravita
263cf26258
[ANY] Update gradle 2025-02-03 01:03:26 +07:00
Gravita
b9ad7c0f26
[ANY] Update dependencies 2025-02-03 01:03:01 +07:00
Gravita
5ba32e3405
[ANY] Update modules 2025-01-27 20:20:47 +07:00
Gravita
907332ff06
[FEATURE] Fix truststore path 2025-01-27 20:20:44 +07:00
microwin7
1d63fbbd93 [FEATURE] Disabling log4j.xml update while launchserver is running 2025-01-07 11:44:55 +03:00
Gravita
2f4667f5a6
Merge tag 'v5.6.9' into dev
5.6.9 stable release
2025-01-03 12:55:53 +07:00
Gravita
92ada65079
Merge branch 'release/5.6.9' 2025-01-03 12:55:42 +07:00
Gravita
29d98defff
[ANY] 5.6.9 stable 2025-01-03 12:55:33 +07:00
Gravita
d7a379383b
[FIX] Remove socket command debug 2024-12-31 14:35:42 +07:00
Gravita
0111b2ca2b
[FEATURE] Add ControlFile and proxy command handlers 2024-12-31 14:19:31 +07:00
microwin7
4671dfe49d [ANY] Added proxy repository jitpack. Sync moduls 2024-12-31 04:18:40 +03:00
Gravita
bb63aaa0ab
[ANY] Update modules 2024-12-13 22:40:23 +07:00
Gravita
912caa6b8a
[FIX] Add more logging to timestamp failed error 2024-11-05 08:52:59 +07:00
Gravita
926094076c
[FIX] Fix NPE with nativePath PR #719 2024-11-05 07:08:31 +07:00
Gravita
a1af61a599
[ANY] Update modules 2024-10-22 17:14:36 +07:00
Gravita
81b16cb54e
[ANY] Update gradle 2024-10-15 18:53:03 +07:00
Gravita
a486f21fa2
[ANY] Update dependencies 2024-10-15 18:48:20 +07:00
Gravita
86ea247f07
Merge tag 'v5.6.8' into dev
v5.6.8 stable
2024-10-13 19:19:00 +07:00
Gravita
d26b179006
Merge branch 'release/5.6.8' 2024-10-13 19:18:50 +07:00
Gravita
c4d1251429
[ANY] 5.6.8 stable 2024-10-13 19:05:35 +07:00
Gravita
f16f5fbc6d
[FIX] NPE: User not found and permissions enabled 2024-10-06 22:59:49 +07:00
Gravita
abe904d73c
[FEATURE] ExtendedCheckServer support in SQLAuthCoreProvider 2024-10-02 20:50:36 +07:00
Gravita
eaf685897f
Merge tag 'v5.6.7' into dev
5.6.7 stable release
2024-09-28 20:31:33 +07:00
Gravita
c8934d887a
Merge branch 'release/5.6.7' 2024-09-28 20:31:23 +07:00
Gravita
070a5d9b69
[ANY] 5.6.7 release 2024-09-28 20:31:10 +07:00
Gravita
cc2bce4300
[FIX] initializeAtStart thread safety 2024-09-28 02:29:19 +07:00
Gravita
c7f4d8ac49
[FEATURE] Support initializeAtStart 2024-09-28 02:27:42 +07:00
Gravita
7dcb08fdaf
[FEATURE] Support HWID in SQLCoreProvider 2024-09-28 01:47:55 +07:00
Gravita
9d870849a1
[ANY] Update dependencies 2024-09-18 16:36:15 +07:00
microwin7
dda3ebc7b4 [FIX] RejectedExecutionException after cancelled Download task 2024-08-23 22:02:13 +03:00
Gravita
537623afaf
Merge tag 'v5.6.6' into dev
5.6.6 stable
2024-08-18 23:57:14 +07:00
Gravita
0cff6e247a
Merge branch 'release/5.6.6' 2024-08-18 23:57:08 +07:00
Gravita
b85075c559
[ANY] 5.6.6 Stable 2024-08-18 23:57:00 +07:00
Gravita
3e654f4d79
[FEATURE] Add support opens, exports, reads to SYSTEM_CLASS_LOADER. Remove AGENT 2024-08-18 23:10:58 +07:00
Gravita
46f1f7b69e
[FIX] Symlink in launcher-pack 2024-08-18 19:18:53 +07:00
microwin7
981f2ac3dd [ANY] Update modules and update version oshi 2024-08-18 01:00:08 +03:00
microwin7
8509cbb6b5 [ANY] Update modules 2024-08-14 00:13:45 +03:00
microwin7
1119625d12 [ANY] Update modules 2024-08-13 05:44:32 +03:00
microwin7
9a69426547 [ANY] Update modules 2024-08-12 07:03:17 +03:00
microwin7
31cbfe2919 [ANY][FEATURE] Update modules. Removed mainClass for Cleanroom
In MakeProfileHelper
2024-08-12 06:01:08 +03:00
microwin7
27ebadcd19 [ANY] Update modules 2024-08-12 02:00:49 +03:00
Antoni
b3349044b5
[ANY] Update patch Version and Type release 2024-08-07 01:27:18 +03:00
Antoni
c43edeb982
[FIX] UpdatesProvider register 2024-08-06 03:25:02 +03:00
Gravita
1ff58099bd
[FIX] UpdatesProvider register 2024-08-06 06:19:12 +07:00
Gravita
9fba637f83
[FIX] Launcher update token 2024-08-05 05:36:53 +07:00
Gravita
ca70ee78d1
[FIX] Launcher update 2024-08-05 05:34:45 +07:00
Gravita
5e116a81e5
[ANY] Update modules 2024-08-05 03:25:05 +07:00
Gravita
b0f799d194
[FIX] UpdatesProvider init 2024-08-05 03:24:42 +07:00
Gravita
63f9f8e21d
[FEATURE] UpdatesProvider Part 2 2024-07-31 00:36:04 +07:00
Gravita
b8ccbc5e48
[FEATURE] UpdatesProvider Part 1 2024-07-31 00:15:08 +07:00
Gravita
a687c5afd8
[ANY] Update gradle 2024-07-30 23:20:35 +07:00
Gravita
3969d81db7
[ANY] Update modules 2024-07-30 23:06:54 +07:00
Gravita
a30d0624a1
[ANY] Update modules 2024-07-30 21:05:37 +07:00
Gravita
d5abe0d411
[ANY] Update modules 2024-07-30 17:34:20 +07:00
Gravita
1e7a856a99
[FIX] Profile duplicate 2024-07-30 15:43:22 +07:00
Gravita
e6f5b585a7
[ANY] Update modules 2024-07-30 15:33:46 +07:00
Gravita
2ed4abf9b0
[FIX] Usage profilesProvider 2024-07-26 01:27:01 +07:00
Gravita
af2dcec8cd
[FIX] ProfileProvider support overwrite profile 2024-07-25 22:28:26 +07:00
Gravita
9bffe07d36
[FEATURE] ProfileProvider 2024-07-25 22:20:48 +07:00
Gravita
4be299f6ca
[FIX] Add ClassLoader.registerAsParallelCapable() 2024-07-25 16:43:00 +07:00
Gravita
ef4f14f9b4
[FIX] Add netty epoll lib for aarch64 (ARM) 2024-07-25 16:33:49 +07:00
Gravita
d720328bc4
[FEATURE] moduleConf in SYSTEM_ARGS 2024-07-25 15:52:39 +07:00
Gravita
88f1eaf750
[ANY] Update modules 2024-07-21 20:39:30 +07:00
Gravita
a5ef86b105
Merge tag 'v5.6.5' into dev
5.6.5-stable
2024-07-21 20:18:08 +07:00
Gravita
b1a5ecdc13
Merge branch 'release/5.6.5' 2024-07-21 20:18:00 +07:00
Gravita
68e9affbe0
[ANY] 5.6.5-stable 2024-07-21 20:17:51 +07:00
Gravita
7d7485afdc
[FIX] Downloader downloadList truncate file 2024-07-21 19:48:55 +07:00
Gravita
c2926b5b40
[ANY] Update modules 2024-07-20 19:20:12 +07:00
Gravita
9c82d76781
[FEATURE][REFACTOR] Refactoring GenerateCertificateModule 2024-07-20 19:19:41 +07:00
Gravita
450774de7e
Merge tag 'v5.6.4' into dev
5.6.4-stable hotfix
2024-07-18 20:35:57 +07:00
Gravita
f88c0308f8
Merge branch 'release/5.6.4' 2024-07-18 20:35:46 +07:00
Gravita
20f713be05
5.6.4-stable 2024-07-18 20:35:26 +07:00
Gravita
5bf92d9a00
[FIX] ProGuard librariesDir 2024-07-18 20:34:31 +07:00
Gravita
903c4d40c5
Merge tag 'v5.6.3' into dev
5.6.3-stable
2024-07-18 15:55:07 +07:00
Gravita
ede9ab2c85
Merge branch 'release/5.6.3' 2024-07-18 15:54:58 +07:00
Gravita
c8c83c0dba
[ANY] 5.6.3-stable 2024-07-18 15:54:45 +07:00
Gravita
1bd5d8854c
[FIX] ProGuard and launchserver.dir.libraries 2024-07-17 01:32:51 +07:00
Gravita
992d31c883
[FEATURE] Set netty bind port in first run 2024-07-16 22:05:13 +07:00
Gravita
accbbe6b13
[FEATURE] Support port in launchserver address in first run 2024-07-16 21:54:59 +07:00
Gravita
0894e0b9c3
[FIX] Sync profiles before updates 2024-07-16 17:11:12 +07:00
Gravita
925007015f
[ANY] Update modules 2024-07-09 20:57:52 +07:00
Gravita
ec526a343d
[FIX] OptionalView.fixDependencies throw out of range 2024-07-08 21:29:40 +07:00
Gravita
1bebd8de2c
[FIX] classLoaderConfig is null 2024-07-08 21:22:44 +07:00
Gravita
c7781b30be
[FIX] launcher-libraries-compile not found 2024-07-06 22:34:20 +07:00
Gravita
df9d05a49c
[FEATURE] Support -Dlaunchserver.dir.modules and -Dlaunchserver.dir.launcher-modules 2024-07-06 03:24:02 +07:00
Gravita
03d53d4a09
[FEATURE] Support -Dlaunchserver.dir.libraries 2024-07-06 02:59:36 +07:00
Gravita
c261496af8
[ANY] Update modules 2024-07-06 01:55:10 +07:00
Gravita
8c11ab0cbe
[FIX] Disable Sodium lwjgl check 2024-07-05 16:27:50 +07:00
Gravita
78b4f1e3aa
[FIX] Gson version 2024-07-05 15:55:54 +07:00
Gravita
bbc5f1722b
[ANY] Update modules 2024-07-05 15:30:03 +07:00
Gravita
51411c5838
[ANY] Update modules 2024-07-05 14:55:21 +07:00
Gravita
3b22b76278
[FIX] Cleanroom install 2024-07-05 14:55:10 +07:00
Gravita
ef9cbfe0da
[ANY] Update modules 2024-07-05 14:38:57 +07:00
Gravita
353b663e12
[FEATURE] Support command execute by args 2024-07-05 14:38:45 +07:00
Gravita
78be606029
[FIX] FabricLoader main class 2024-07-05 14:27:45 +07:00
Gravita
584acdb8c3
[ANY] Update dependencies 2024-07-05 14:15:22 +07:00
Gravita
7f6a645dd7 [FIX] Compile fix 2024-06-01 23:16:34 +07:00
luckybl0ck
c6930ded74
[FIX] Set Java distrubution in Actions workflow (#714) 2024-06-01 23:11:50 +07:00
Gravita
c2a6a408c4 [FIX] Hikari getConnection() deadlock when with using user_permissions table 2024-06-01 23:10:56 +07:00
luckybl0ck
01cd50840a
[ANY] Update actions versions (#713) 2024-06-01 22:21:35 +07:00
Gravita
bb4d5b99c6 [ANY] 5.6.3-dev 2024-06-01 00:13:00 +07:00
Gravita
ff2f647b50 Merge tag 'v5.6.2' into dev
5.6.2 stable
2024-05-31 23:53:32 +07:00
Gravita
79fc42e86a Merge branch 'release/5.6.2' 2024-05-31 23:53:22 +07:00
Gravita
5b8aa8cd5e [ANY] 5.6.2-stable 2024-05-31 23:45:01 +07:00
Gravita
a4e5ef9d01 [FIX] Bouncy Castle 2024-05-31 23:30:19 +07:00
Gravita
1d5044c24a [FIX] Bouncy Castle cert gen 2024-05-31 22:58:18 +07:00
Gravita
b84911d445 [ANY] Update modules 2024-05-30 22:46:28 +07:00
Gravita
6a173b9b1b [ANY] Update modules 2024-05-30 22:35:27 +07:00
Gravita
6a53891c6a [ANY] Update dependencies 2024-05-30 22:28:34 +07:00
XakepSDK
7c637e078d
[FIX] Fix OpenID access token validation (#712)
Co-authored-by: d3coder <admin@xakeps.dk>
2024-05-24 00:42:32 +07:00
Gravita
c9a81da60c [FIX] Profile generation 2024-04-26 02:01:50 +07:00
Gravita
6c0ead015b [FIX] NPE in new profiles 2024-04-26 01:49:09 +07:00
XakepSDK
b5457ee866
[FIX OpenID validate issuer and aud (#710)
Co-authored-by: d3coder <admin@xakeps.dk>
2024-04-25 22:05:53 +07:00
Gravita
52c9196dcc [FIX] SQLCoreProvider 2024-04-25 03:05:13 +07:00
Gravita
095a5aef8b [FEATURE] Add mariadb connector 2024-04-25 02:09:17 +07:00
Gravita
765f1a9d8f [FEATURE] SQLCoreProvider 2024-04-25 02:06:44 +07:00
Gravita
9bd65c797b [REFACTOR] ClientProfileBuilder 2024-04-25 01:31:46 +07:00
XakepSDK
8908710ad6
[ANY] Add OpenID auth module (#709)
Co-authored-by: d3coder <admin@xakeps.dk>
2024-04-24 20:21:16 +07:00
Gravita
748612783c Merge tag 'vv5.6.1' into dev
5.6.1 stable
2024-04-21 13:42:04 +07:00
Gravita
42cf9bc79e Merge branch 'release/v5.6.1' 2024-04-21 13:41:55 +07:00
Gravita
8a81989d65 [ANY] 5.6.1 stable 2024-04-21 13:41:41 +07:00
Gravita
58fd3a7e8b [FIX] Add 'Eclipse Adoptium' to java search directory 2024-04-14 21:06:51 +07:00
Gravita
cc6ed82afb [FIX] Forge 1.7.10 lwjgl3ify classpath order 2024-04-14 20:53:09 +07:00
Gravita
00ab20473c [FIX] Strict profile access, update gradle 2024-04-10 16:49:05 +07:00
Gravita
cdb54b34de [ANY] Update modules 2024-04-03 22:13:03 +07:00
XakepSDK
1ebe68f5b8
[ANY] Add query helper (#708)
* [ANY] Add query helper

* [ANY] Rename AuthCodePassword field to the uri

---------

Co-authored-by: d3coder <admin@xakeps.dk>
2024-04-02 00:09:38 +07:00
Gravita
b719255bd5 [ANY] 5.6.1 dev 2024-03-27 23:37:55 +07:00
Gravita
6ecf716fca [FIX] ProGuard 2024-03-27 23:37:08 +07:00
Gravita
873100cf0a Merge tag 'v5.6.0' into dev
5.6.0 stable
2024-03-24 22:13:25 +07:00
Gravita
a8b165f081 Merge branch 'release/5.6.0' 2024-03-24 22:13:15 +07:00
Gravita
06ada30459 [ANY] 5.6.0 stable 2024-03-24 22:10:25 +07:00
Gravita
6017a89e20 [ANY] 5.6.0 beta 2024-03-24 16:11:32 +07:00
Gravita
bd677c26ba [FIX] Oshi requires slf4j api 2024-03-23 14:09:47 +07:00
Gravita
e5840243b3 [ANY] Update gradle 2024-03-22 13:40:46 +07:00
Gravita
09d36e066a [ANY] Update modules 2024-03-21 19:41:00 +07:00
Gravita
038af764a1 [REFACTOR] IDEA Code Inspect 2024-03-21 19:40:45 +07:00
Gravita
f7decac23d [FIX] Jwt library remove deprecated 2024-03-20 12:40:24 +07:00
zznty
1710eb7bec
[FIX] Fix resolution of files with special characters for embedded file server (#705) 2024-03-16 21:50:47 +07:00
XakepSDK
3926f3e5bf
[ANY] Update JWT library (#706)
Co-authored-by: d3coder <admin@xakeps.dk>
2024-03-14 18:07:44 +07:00
microwin7
7759ea9182 Revert "Merge pull request #703 from zznty/dev"
This reverts commit 3e6af5afd3, reversing
changes made to 730efae7c7.
2024-03-12 19:33:17 +03:00
zznty
ac6c312ed4
[FIX] Fix log4j config unpacking (#704) 2024-03-12 21:46:17 +07:00
microwin7
3e6af5afd3
Merge pull request #703 from zznty/dev
[FIX] Fix resolution of files with special characters for embedded file server
2024-03-12 17:06:25 +03:00
zznty
044813cca2 [FIX] Fix resolution of files with special characters for embedded file server 2024-03-12 20:56:23 +07:00
Gravita
730efae7c7 [ANY] Update modules 2024-03-12 16:08:35 +07:00
Gravita
bc6da641d6 [FEATURE] Support autobuild lwjgl3ify 2024-03-12 16:08:30 +07:00
Gravit'a
5c7f7eedec [FIX] Possible problem with lwjgl 2024-03-10 15:49:01 +07:00
Gravit'a
e72e4ebb92 [ANY] Update modules 2024-03-10 14:54:38 +07:00
Gravit'a
d811a04cba [FIX] DeleteProfileCommand 2024-03-10 14:53:52 +07:00
Gravit'a
572052163b [ANY] Update modules 2024-03-10 14:47:53 +07:00
Gravit'a
666c8a4b3e [ANY] Update modules 2024-03-10 14:03:25 +07:00
microwin7
ef5f932afb [FIX] Sort files in installAuthlib 2024-03-09 14:28:24 +03:00
microwin7
3002371fad [FEATURE] Sort jar files, before patching in installAuthlib 2024-03-09 00:40:28 +03:00
Gravita
998db80837 [ANY] Update modules 2024-03-08 14:46:55 +07:00
Gravita
494b3227b6 [FIX] Remove deprecated 'new URL' 2024-03-08 14:46:43 +07:00
Gravita
d686d9a388 [FEATURE] Add newHttpClientBuilder() 2024-03-08 14:37:15 +07:00
Gravita
e28c9773fc [FIX] file.encoding utf-8 by default 2024-03-05 19:07:02 +07:00
Gravita
7ff062f9e4 [ANY] Update modules 2024-03-05 16:48:35 +07:00
Gravita
29619bb7a4 [FIX] WebSocket dev log 2024-03-03 15:29:58 +07:00
Gravita
3179ee00eb [ANY] Update modules 2024-03-03 13:39:49 +07:00
Gravita
f484f045ca [FEATURE] FxRuntimeOptimizerModule 2024-03-03 13:39:28 +07:00
Gravita
ead4689bcf [FIX] checkServer token 2024-03-01 14:18:09 +07:00
Gravit
7a96e67517
Update push.yml 2024-03-01 14:11:24 +07:00
Gravita
b21082e201 [FIX] Netty in ServerWrapper 2024-02-27 16:50:58 +07:00
Gravita
8cd43b0324 [FEATURE] clearLauncherPackages, LaunchServerControlHolder 2024-02-27 16:33:43 +07:00
Gravita
3e8c1adebe [FIX] GetConnectUUIDCommand 2024-02-27 16:20:55 +07:00
Gravita
666644c9e0 [FEATURE] GetConnectUUIDCommand, shardId 2024-02-27 16:12:50 +07:00
Gravita
3152758d31 [FEATURE] GetConnectUUIDRequest 2024-02-27 16:04:17 +07:00
Gravita
80176ff1e1 [FEATURE] sync updatescache command 2024-02-27 15:53:27 +07:00
Gravita
11382d3465 [FEATURE] Profile delete and profile list commands 2024-02-27 15:34:20 +07:00
microwin7
31285a8066 [ANY] Update modules 2024-02-24 22:15:04 +03:00
Gravita
3ec79e3e93 [ANY] Update modules 2024-02-23 14:42:17 +07:00
Gravita
a4bf033aa8 [FEATURE] Support sudo in mysql/psotgresql/filesystem AuthCoreProvider 2024-02-23 14:42:00 +07:00
Gravita
4e50cea93a [FEATURE] Use encrypted ClientParams 2024-02-22 17:33:44 +07:00
Gravita
d40dc09aca [FEATURE] Handle non 2XX codes in Downloader 2024-02-15 01:31:27 +07:00
Gravita
0b59d6c0ed [FEATURE] Profile clone command 2024-02-10 14:47:13 +07:00
Gravita
80fc2900c8 [FEATURE] Public-Only server token 2024-02-07 14:27:04 +07:00
Gravita
4f47398211 [ANY] Update modules 2024-02-07 13:47:31 +07:00
Gravita
9676e55bcb [FEATURE] Support sudo 2024-02-07 13:47:18 +07:00
Gravita
aa7b007616 [FIX] Launcher log 2024-02-03 17:35:27 +07:00
Gravita
35bdf1607f [FEATURE] Add thread-safe info to responses 2024-02-03 17:11:36 +07:00
Gravita
7060697bad [FEATURE] Support virtual threads and client locks 2024-02-03 17:08:07 +07:00
Gravita
34ac6a0f28 Merge branch 'experimental/nojava8support' into dev 2024-01-31 15:42:19 +07:00
Gravita
5370130c2d Merge tag 'v5.5.4' into dev
5.5.4 stable
2024-01-31 14:36:57 +07:00
Gravita
db6ab061de Merge branch 'release/5.5.4' 2024-01-31 14:36:49 +07:00
Gravita
aeb55470ce [ANY] 5.5.4 stable 2024-01-31 14:36:41 +07:00
Gravita
a0788e4623 [FIX] Remove legacy launch4j in build.gradle 2024-01-23 19:44:19 +07:00
Gravita
0c754ae5e6 [FIX] Remove legacy manifest attributes 2024-01-23 19:35:54 +07:00
Gravita
c9ccf36252 [ANY] Remove reg limiter 2024-01-23 19:34:53 +07:00
Gravita
b7b7afbdbb [ANY] Update modules 2024-01-23 19:11:48 +07:00
Gravita
2fdd7d0199 [FIX] Slf4j fix 2024-01-23 19:11:33 +07:00
Gravit
1e3676778e
Merge pull request #696 from microwin7/dev
[FIX][FEATURE] Merge commits from nojava8support ref. Proguard, with jvmArgs
2024-01-18 02:57:44 +07:00
Gravita
ab884c8d23 [FEATURE] Add ProGuard jvmArgs 2024-01-17 20:24:43 +03:00
dima_dencep
48946d6e74 [FIX] proguard (#694) 2024-01-17 20:24:32 +03:00
microwin7
f075f39954
Merge branch 'GravitLauncher:dev' into dev 2024-01-17 20:22:02 +03:00
Gravita
f1922c52e2 [FEATURE] Add ProGuard jvmArgs 2024-01-18 00:13:36 +07:00
Gravita
f42e6de0b0 [ANY] Update dependencies 2024-01-17 23:51:56 +07:00
Gravita
efe967587c [FIX] Finally remove launch4j 2024-01-14 17:25:55 +07:00
Gravita
f2b92c2bbd [FIX] Update mirror link 2024-01-14 17:21:58 +07:00
Gravit'a
4251725467 [ANY] Update modules 2024-01-13 18:42:42 +07:00
dima_dencep
82bf2fdf56
[FIX] proguard (#694) 2024-01-12 16:02:02 +07:00
Gravita
f1bc0ea28a [ANY] Update modules 2024-01-09 16:59:15 +07:00
microwin7
8762aa470c
[FIX] Backport support arch i586 in release file (#693)
Co-authored-by: Gravita <12893402+gravit0@users.noreply.github.com>
2024-01-08 15:19:17 +07:00
Gravita
cfcd0010a7 [FIX] Support arch i586 in release file 2024-01-07 16:36:53 +03:00
Gravita
b3eb0ebb98 [FIX] Support arch i586 in release file 2024-01-07 20:18:15 +07:00
Gravita
8e82f5cd84 [FEATURE][EXPERIMENTAL] Parse java args method 2024-01-07 20:15:29 +07:00
Gravita
90f6d002d1 [FIX] Wayland support 2024-01-03 13:17:59 +07:00
Gravita
449798d52b [FIX] ServerWrapper 2023-12-29 17:07:03 +07:00
Gravita
f321b8bd27 [FIX] ExitResponse, update SimpleModuleManager 2023-12-29 16:37:14 +07:00
Gravita
64635cbb9b [REFACTOR] Renaming 2023-12-23 17:58:09 +07:00
Gravita
4607ab88bf [ANY] Update modules 2023-12-23 12:25:55 +07:00
Gravita
e6516a8991 [REFACTOR] IDEA mini refactor 2023-12-23 12:25:11 +07:00
Gravita
dfbb6e507a [REFACTOR] Using Java 17 2023-12-23 12:18:10 +07:00
Gravita
0855fc589d [REFACTOR] Remove log4j support, new LaunchServer start 2023-12-23 12:06:54 +07:00
Gravita
c9b6b0279a [REFACTOR] Renaming 2023-12-23 12:05:23 +07:00
Gravita
f8b060422e [FEATURE] Improve LaunchServer start 2023-12-20 04:45:41 +07:00
Gravita
31489a2b24 [FIX] Improve Wayland support 2023-12-20 02:13:39 +07:00
Gravita
6c0500f528 [ANY] 5.5.4-dev 2023-12-14 01:39:21 +07:00
Gravita
5896a12449 [FEATURE] Support option loadNatives 2023-12-14 01:36:07 +07:00
Gravita
240e36aab6 [FIX] Start Forge 1.18+ server 2023-12-14 01:19:36 +07:00
Gravita
f6f6ea13ad [ANY] Experimental branch 2023-12-08 20:24:31 +07:00
Gravita
967b81cc85 Merge tag 'v5.5.3' into dev
5.5.3 stable
2023-12-08 18:25:18 +07:00
Gravita
6dadea1b67 Merge branch 'release/5.5.3' 2023-12-08 18:25:10 +07:00
Gravita
a601a4ceef [ANY] Update modules 2023-12-08 17:53:51 +07:00
Gravita
1c90681b3b [FEATURE] Support Minecraft 1.20.3/1.20.4 2023-12-08 17:53:38 +07:00
Gravita
7b1f449667 [ANY] Update modules 2023-12-08 16:51:26 +07:00
Gravita
ae24fd6ccb [ANY] 5.5.3-stable 2023-12-08 16:51:10 +07:00
Gravita
2ff1d81076 [FEATURE] Support run Minecraft with Wayland 2023-12-01 20:26:06 +07:00
Gravita
ee0a7bc25a [FIX] Support mysql/postgresql 1.20.2 2023-12-01 17:59:05 +07:00
Gravita
ebbd1c87e8 [FIX] ModuleLaunch NPE 2023-11-30 00:05:59 +07:00
Gravita
3754a327b0 [FEATURE] ConfigService 2023-11-28 18:21:32 +07:00
Gravita
d2f34ced28 [FEATURE][EXPERIMENTAL] Add ClientServer and AuthService to ServerWrapper, extended check server, remove deprecated interfaces 2023-11-27 22:41:49 +07:00
Gravita
43626bf1f4 [FEATURE] Support createHackLookupNative 2023-11-26 20:51:58 +07:00
Gravita
380179faa3 [FIX] SystemdNotifyModule 2023-11-26 15:08:05 +07:00
Gravita
2e60d45c63 [FEATURE][EXPERIMENTAL] Support add javafx in LauncherEngineWrapper 2023-11-26 15:07:50 +07:00
Gravita
d678daac7b [FIX] Systemd notify logger 2023-11-25 00:28:00 +07:00
Gravita
1bc9351b0c [FIX] Compile fix 2023-11-21 13:58:10 +07:00
Gravita
54bfc6de9c [FIX] No refresh in client 2023-11-21 13:47:45 +07:00
Gravita
fe374c1f9e [ANY] Update modules 2023-11-21 13:17:48 +07:00
Gravita
3f4bdceb5a Merge tag 'v5.5.2' into dev
5.5.2 stable
2023-11-20 17:15:06 +07:00
Gravita
3d61635c6b Merge branch 'release/5.5.2' 2023-11-20 17:14:57 +07:00
Gravita
0c2779f1c0 [ANY] 5.5.2 stable 2023-11-20 16:47:23 +07:00
Gravita
8f598a40c5 Revert "[FIX] Force exit JVM"
This reverts commit 4720e4d106.
2023-11-19 14:19:56 +07:00
Gravita
4720e4d106 [FIX] Force exit JVM 2023-11-19 14:04:29 +07:00
Gravita
0482cfa9ab [ANY] Update modules 2023-11-10 00:32:40 +07:00
Gravita
a2167d483a [ANY] Update modules 2023-11-09 14:49:25 +07:00
Gravita
84a3845f1a [ANY] 5.5.2-dev 2023-11-04 21:51:18 +07:00
Gravita
0d5d772141 [ANY] Update modules 2023-11-04 21:50:31 +07:00
Gravita
9df116f951 [FIX] MirrorHelper 2023-11-04 21:50:11 +07:00
Gravita
ff3d500cc0 Merge tag 'v5.5.1' into dev
5.5.1 stable
2023-11-01 18:10:09 +07:00
Gravita
2e10c78ad2 Merge branch 'release/5.5.1' 2023-11-01 18:10:02 +07:00
Gravita
b6be2e243d [ANY] 5.5.1 stable 2023-11-01 17:40:52 +07:00
Gravita
44bc8b0bbc [FEATURE] Support modular start 2023-11-01 04:05:14 +07:00
Gravita
6cd5a69149 [FEATURE] ModuleLaunch bug fix 2023-11-01 00:10:19 +07:00
Gravita
b638efc0d1 [FEATURE] Support compat classes in ServerWrapper 2023-10-31 22:57:37 +07:00
Gravita
f2cbf0ed38 [ANY] Update modules 2023-10-31 22:52:21 +07:00
Gravita
0f36dfec16 [FEATURE] Support compat classes in client debug 2023-10-31 22:27:55 +07:00
Gravita
c1df548258 [FEATURE] Unified launch 2023-10-31 22:18:10 +07:00
Gravita
429c7a45c4 [ANY] Update modules 2023-10-31 16:59:23 +07:00
Gravita
90e116720c [FIX] onHardwareReport NPE 2023-10-31 16:22:44 +07:00
Gravita
4b222b9526 Merge tag 'v5.5.0' into dev
5.5.0 stable
2023-10-31 01:53:01 +07:00
Gravita
1df283d659 Merge branch 'release/5.5.0' 2023-10-31 01:52:54 +07:00
Gravita
b45618c0da [ANY] 5.5.0 stable 2023-10-31 01:52:41 +07:00
Gravita
0241a4d887 [ANY] Update modules 2023-10-31 01:29:45 +07:00
Gravita
de5ebe4a74 [ANY] Update modules 2023-10-31 00:59:25 +07:00
Gravita
80862e6116 [FEATURE] NoProtectHandler - disable joinServer protection 2023-10-31 00:20:57 +07:00
Gravita
f22aa36926 [FIX] Support Debug client with memory type 2023-10-31 00:14:56 +07:00
Gravita
198ce95176 [FEATURE] Support Debug client with memory type 2023-10-31 00:14:38 +07:00
Gravita
fca2ed2447 [FEATURE] Support 1.20+ autoenter 2023-10-30 23:11:05 +07:00
Gravita
2792b5a008 [ANY] Update modules 2023-10-30 22:17:24 +07:00
Gravita
a0335bd340 [ANY] Update modules 2023-10-30 22:06:48 +07:00
Gravita
3c6b8322a5 [ANY] Modules update 2023-10-30 19:45:36 +07:00
Gravita
a83f225933 [FIX] File not exist 2023-10-30 19:29:12 +07:00
Gravita
99af83fb06 [ANY] Update modules 2023-10-30 15:57:41 +07:00
Gravita
c4672387ac [ANY] Update modules 2023-10-29 21:50:15 +07:00
Gravita
fe7ae41f65 [FEATURE] Remove deprecated http methods, fix download 2023-10-29 21:18:47 +07:00
Gravita
474d557e3f [FIX] JsonTextureProvider 2023-10-29 20:16:23 +07:00
Gravita
50e6bb3b49 [FIX] Default config 2023-10-29 19:02:04 +07:00
Gravita
e85a12afab [FIX] Change default refresh rate to 5 seconds 2023-10-29 03:34:00 +07:00
Gravita
9e83e8bec8 [FIX] Use custom thread factory in autorefresh 2023-10-29 03:30:13 +07:00
Gravita
fce8453bd1 [FIX] Enable autoRefresh in default 2023-10-29 03:27:43 +07:00
Gravita
224649aa13 [FIX] Enable autoRefresh in default 2023-10-29 03:24:27 +07:00
Gravita
a3bcfed793 [ANY] Update gradle 2023-10-28 19:52:39 +07:00
Gravita
e1429356df [FIX] Build without proguard 2023-10-28 18:49:07 +07:00
Gravita
75f51c7727 [FIX] Use log4j-core annotation processor 2023-10-26 17:39:15 +07:00
Gravita
90162a1a25 [ANY] Update modules 2023-10-25 22:41:17 +07:00
Gravita
62e9276481 [FEATURE] Update build pipeline, fix multi release jar with proguard 2023-10-25 22:41:06 +07:00
Gravita
79f933646c [ANY] Update modules 2023-10-23 23:51:09 +07:00
Gravita
01c963d852 [ANY] Update modules 2023-10-23 23:08:18 +07:00
Gravita
941bf115b1 [FIX] New mirror path 2023-10-22 18:38:15 +07:00
Gravita
2e6d7bd94a [FIX] Improve JsonTextureProvider 2023-10-22 18:07:50 +07:00
Gravita
d262b99be6 [ANY] Update modules 2023-10-22 15:29:25 +07:00
Gravita
b5e10e8f9d [FEATURE] JsonTexture convertMap 2023-10-22 15:27:54 +07:00
Gravita
cebeb55c00 [FIX] Change JsonTextureProvider behavior, delete http method 2023-10-21 20:31:46 +07:00
Gravita
7e16f36ea0 [FIX] DebugMain exit 2023-10-21 19:16:01 +07:00
Gravita
8973a3462b [FEATURE] Support category in optional mods 2023-10-21 16:16:28 +07:00
Gravita
82dc299752 [FIX] Remove javafx.swing module 2023-10-18 18:10:16 +07:00
Gravita
19f966062b [ANY] Update modules 2023-10-10 16:14:28 +07:00
Gravita
93f916192e [FEATURE] MirrorHelper support build script 2023-10-10 16:14:10 +07:00
Gravita
dbeca56b05 [FEATURE] Support custom buttons 2023-10-06 12:55:07 +07:00
Gravita
d7474255da [ANY] Update modules 2023-10-03 19:16:23 +07:00
Gravita
b72fb643d4 [FEATURE] Support 1.20.2 2023-10-03 19:16:02 +07:00
Gravita
52e8f693b5 [FIX] AssetUploadInfo 2023-09-28 12:36:47 +07:00
Gravita
1f3b7e0552 [FEATURE] UploadAssetMixProvider 2023-09-26 14:08:44 +07:00
Gravita
183cfe949f [FEATURE] AssetUploadInfo 2023-09-26 13:55:01 +07:00
Gravita
aff254a875 [FEATURE] Support auth features in API 2023-09-24 00:13:32 +07:00
Gravita
e12f2ef897 [FEATURE] Support properties in ServerWrapper 2023-09-21 22:08:03 +07:00
Gravita
58d8ba2358 [FIX] Reset null config 2023-09-20 19:52:46 +07:00
Gravita
1cc3edd15b [ANY] Update modules 2023-09-20 19:33:15 +07:00
Gravita
606df6cb1a [ANY] IDEA code inspect 2023-09-20 19:32:49 +07:00
Gravita
98a314f697 [ANY] Update modules 2023-09-20 19:22:24 +07:00
Gravita
d03c6120ff [FIX] Sentry module Java 8 2023-09-20 19:22:04 +07:00
Gravita
a34267e902 [FEATURE] Use Java 21 2023-09-20 19:11:33 +07:00
Gravita
0ccef10a93 [FEATURE] Print error for unsupported Java 2023-09-19 16:44:09 +07:00
Gravita
29aee9dd30 [ANY] 5.5.0 dev 2023-09-18 16:26:47 +07:00
Gravita
1d563249d1 [FEATURE] Support build-in javafx in Java 9+ 2023-09-18 16:12:58 +07:00
Gravita
d0d2860317 [ANY] Gradle update 2023-09-18 16:12:58 +07:00
Gravita
faa5189795 [FEATURE][EXPERIMENTAL] Support debug args 2023-09-18 16:12:58 +07:00
Gravita
d9082f21a3 [ANY] Delete old interfaces 2023-09-18 16:12:58 +07:00
Gravita
3475f2f912 [FIX] Compile fix 2023-09-18 16:12:58 +07:00
Gravita
b635447eaf [FEATURE] Support Asset Upload 2023-09-18 16:12:58 +07:00
Gravita
0fb6102c29 [FEATURE] MixProvider init 2023-09-18 16:12:58 +07:00
Gravita
d4cc28f96a [FEATURE] MixProvider 2023-09-18 16:12:58 +07:00
Gravita
49a5215783 [ANY] Update modules 2023-09-18 16:12:58 +07:00
Gravita
f12d13ef58 [FIX] NPE 2023-09-18 16:12:58 +07:00
Gravita
55c77dd343 [FIX] Auto refresh 2023-09-18 16:12:58 +07:00
Gravita
caebd6b5de [FEATURE] Extended Token Expire, auto refresh 2023-09-18 16:12:58 +07:00
Gravita
647c8dba5c [FIX] Client debug 2023-09-18 16:12:58 +07:00
Gravita
6ffbc5515f [FEATURE] Client debug 2023-09-18 16:12:58 +07:00
Gravita
65c6520001 [ANY] Update modules 2023-09-18 16:12:58 +07:00
Gravita
ac9a78cea4 [ANY] Change no runtime module error message 2023-09-18 16:12:58 +07:00
Gravita
00a4a13536 [ANY] Update modules 2023-09-18 16:12:58 +07:00
Gravita
6e45a84c1c [FEATURE] Support lmodule with Java 17 2023-09-18 16:12:58 +07:00
Gravita
b31dd78b2b [ANY[ Update modules 2023-09-18 16:12:58 +07:00
Gravita
9de81095b1 [FEATURE][EXPERIMENTAL] separate branch 2023-09-18 16:12:58 +07:00
microwin7
4d1fd23e84
[FIX] Added Multi Release for LauncherCore (#672) 2023-07-30 14:32:13 +07:00
Gravita
41f00c2310 [FIX] Check certificate expired 2023-07-25 17:19:21 +07:00
Gravita
85986c2916 [FEATURE] Check certificate expired 2023-07-25 17:10:18 +07:00
Gravita
1bc0443dd5 Merge tag 'v5.4.4' into dev
5.4.4 stable
2023-07-25 16:35:06 +07:00
Gravita
50de0b1e44 Merge branch 'release/5.4.4' 2023-07-25 16:34:56 +07:00
Gravita
39d5eee51c [ANY] 5.4.4 stable 2023-07-25 16:34:38 +07:00
Gravita
8153c3a438 [FIX] componentName in config 2023-07-21 21:18:12 +07:00
Gravita
9d81db25d8 [ANY] Update modules 2023-07-21 21:17:37 +07:00
Sevastjan
d4ca612bff
[FEATURE] Фикс зависимостей и возможность взаимоисключения для опциональных модов (#663)
* [FEATURE] Mutually exclusive optional mods (XOR logic)

* [FIX] Bug with missing forgotten dependency/conflict

* [FIX] ArrayIndexOutOfBoundsException if xorConfict is empty

* [STYLE] Rename "xorConflict" to "group"
2023-07-21 21:11:48 +07:00
microwin7
680244e5d1
[FIX] Should no longer go into debugging ServerPinger (#669) 2023-07-21 21:09:05 +07:00
microwin7
2f7b94365a
[FIX] Proguard mapping letter L (#670) 2023-07-21 21:08:45 +07:00
Gravita
60f742b3ef Merge tag 'v5.4.3' into dev
5.4.3 stable
2023-07-16 14:33:42 +07:00
Gravita
7fee478552 Merge branch 'release/5.4.3' 2023-07-16 14:33:33 +07:00
Gravita
7efe7c8611 [ANY] Update modules 2023-07-16 14:32:34 +07:00
Gravita
d4abf27989 [ANY] 5.4.3 stable 2023-07-16 14:12:09 +07:00
Gravita
e887035920 [FIX] Remove experimental warning 2023-07-16 13:59:45 +07:00
Gravita
890591d2d2 [ANY] Update modules 2023-07-16 13:52:22 +07:00
Gravita
82938fe8d4 [FIX] Remove old style assets folder 2023-07-16 13:36:45 +07:00
Gravita
cebe47939a [ANY] Update asm 2023-07-16 13:19:23 +07:00
Gravita
fd24ca0ca7 [ANY] Update depencencides 2023-07-16 13:18:00 +07:00
Gravita
663685934b [ANY] Update gradle wrapper 2023-07-16 13:15:06 +07:00
Gravita
43d944bee1 [ANY] Update modules 2023-07-16 13:13:54 +07:00
microwin7
3a82065889
[FEATURE] JVMHelper class extension (#667) 2023-07-16 13:12:41 +07:00
microwin7
55c0cdfa0d
[FEATURE] Replaced with use TimeUnit (#666) 2023-07-16 13:11:58 +07:00
microwin7
b12c43676b
[FEATURE] Replaced String.format to formatted (#665) 2023-07-16 13:11:45 +07:00
Gravita
9d49eebffe [ANY] Update modules 2023-07-15 14:38:31 +07:00
microwin7
2aa8dffcaa
[REFACTOR] Replaced to pattern matching instanceof (#664) 2023-07-15 14:37:26 +07:00
Gravita
216928f258 [ANY] Update modules 2023-07-12 04:03:17 +07:00
Gravita
ec3775286c [ANY] Update modules 2023-07-03 22:32:18 +07:00
microwin7
7950eea975
Updating .gitattributes to common standards (#648) 2023-06-30 20:23:23 +07:00
microwin7
04dd7d655c
[ANY] Case ignoring for commands in ServerWrapper (#657) 2023-06-30 20:22:22 +07:00
Gravita
bd83e8a4c5 [FEATURE] Support hikariMaxLifetime 2023-06-30 20:21:20 +07:00
Gravita
d4f63a4e19 [ANY] Update modules 2023-06-28 19:21:09 +07:00
Gravita
c458283efb [ANY] Update modules 2023-06-19 01:50:09 +07:00
Gravita
bea7898939 [FEATURE] Change hash type to sha1 2023-06-09 18:25:08 +07:00
Gravit'a
bddf31c94e [FEATURE] LaunchServerLauncherExeInit 2023-05-25 15:33:01 +07:00
Gravita
24d625fd16 Merge tag 'v5.4.2' into dev
5.4.2 stable
2023-05-20 15:54:51 +07:00
Gravita
0c23b59749 Merge branch 'release/5.4.2' 2023-05-20 15:54:32 +07:00
Gravita
9b2c98e10b [ANY] 5.4.2 stable 2023-05-20 13:48:29 +07:00
Gravita
4a538cde61 [ANY] Update modules 2023-05-15 13:22:28 +07:00
Gravita
d9be4bb577 [FEATURE] Support LauncherAuthlib4 2023-05-15 13:22:24 +07:00
microwin7
ae426b2fd0
[FIX] Incorrect send AuthException for User not found (#651) 2023-05-13 15:49:30 +07:00
Gravita
498325f3e8 [ANY] Update modules 2023-05-08 00:42:00 +07:00
Gravita
907e7cc47e [ANY] Update modules 2023-05-07 00:10:23 +07:00
Gravita
d4eabbc4c0 [FIX] Remove digest check 2023-05-06 00:25:48 +07:00
Gravita
540ad0b0da Merge tag 'v5.4.1' into dev
5.4.1 stable
2023-04-28 21:23:09 +07:00
Gravita
3b8c01835d Merge branch 'release/5.4.1' 2023-04-28 21:22:54 +07:00
Gravita
00baf4adf0 [ANY] 5.4.1 stable 2023-04-28 21:22:31 +07:00
Gravita
e338bb9a02 [FIX] Autoupdate mirror link 2023-04-28 21:19:44 +07:00
Gravita
373fc8a255 [ANY] 5.4.1 dev 2023-04-28 20:44:47 +07:00
Gravita
73d8a037d5 Merge tag 'v5.4.0' into dev
5.4.0 stable
2023-04-28 20:42:21 +07:00
Gravita
aa47fd6f1b Merge branch 'release/5.4.0' 2023-04-28 20:42:07 +07:00
Gravita
dec86c9a91 [ANY] 5.4.0 stable 2023-04-28 20:41:48 +07:00
Gravita
74af58bc7a [ANY] Remove deprecated flag 2023-04-28 01:02:40 +07:00
Gravita
d97b856ad6 [FIX] Update mysql connector 2023-04-28 00:08:31 +07:00
Gravita
5436b2a2d6 [FIX] Double read textures 2023-04-27 21:12:21 +07:00
Gravita
5aa4fe8d47 [ANY] Update modules 2023-04-27 21:03:21 +07:00
Gravita
b10535042f [FIX] FileAuthSystem slim support 2023-04-27 21:02:30 +07:00
Gravit
9351f3ca1e
Merge pull request #647 from microwin7/patch-15
[FIX] DownloadAssetCommand.java command
2023-04-25 20:31:50 +07:00
microwin7
e05aa4b204
[FIX] DownloadAssetCommand.java command
ArrayIndexOutOfBoundsException
2023-04-25 16:28:14 +03:00
Gravita
bfa6966ec6 [ANY] Update mirror link 2023-04-22 20:17:02 +07:00
Gravita
50b463b439 [FEATURE] Support custom protocol 2023-04-21 16:14:33 +07:00
Gravita
6caa34e255 [FEATURE] MirrorHelper Quilt support 2023-04-21 15:34:42 +07:00
Gravita
26c017a277 [ANY] Update modules 2023-04-20 21:48:52 +07:00
Gravita
48799cf3c2 [FEATURE] New ClientProfile$Version 2023-04-20 19:06:12 +07:00
Gravita
3bc8040352 [FEATURE] MirrorHelper Modrinth support 2023-04-20 15:54:02 +07:00
Gravita
dcaec54814 [ANY] Update modules 2023-04-18 14:53:35 +07:00
Gravit'a
76f8b4602c [FIX] JAVA_HOME override 2023-04-15 17:40:34 +07:00
Gravit'a
fc7f96d536 [FIX] launcher-pack in Windows 2023-04-15 13:59:32 +07:00
Gravit'a
4ed687087f [FIX] LauncherGuard default config 2023-04-15 13:51:33 +07:00
Gravita
95da394a5d [FEATURE] LauncherGuard module 2023-04-11 13:28:31 +07:00
Gravita
06e9bc8578 [ANY] IDEA code inspect 2023-04-03 13:04:12 +07:00
Gravita
e0b3f3d6a5 [FEATURE] Launcher build number 2023-03-29 23:46:26 +07:00
Gravita
6a057514b2 [FIX] RequestTextureProvider localPath 2023-03-26 23:57:28 +07:00
Gravita
70d102222b [ANY] Upgrade gradle 2023-03-25 23:54:00 +07:00
Gravita
55d2fbd57f [ANY] Update modules 2023-03-23 20:28:03 +07:00
Gravita
111d7616d0 [FIX] NPE 2023-03-23 18:56:23 +07:00
Gravita
fb2883d215 [FIX] Possible multithreading issue 2023-03-22 21:46:40 +07:00
Gravita
dc664c7ee2 [FIX] Forbidden modification info 2023-03-22 21:18:08 +07:00
Gravita
eff739ce12 [ANY] Update modules 2023-03-20 00:25:55 +07:00
Gravita
17f9c28f3d [FEATURE] WebSocket hook rework 2023-03-20 00:25:27 +07:00
Gravita
71739f5670 [ANY] Update modules 2023-03-19 21:27:14 +07:00
Gravita
e4bf8f1e9c [ANY] Update modules 2023-03-19 21:22:37 +07:00
Gravita
a796b82a16 [FIX] JavaHelper NPE 2023-03-16 21:57:33 +07:00
Gravita
cf802fb0b3 [FEATURE] Support 1.19.4 2023-03-15 18:50:15 +07:00
Gravita
57868a7136 [ANY] Update modules 2023-03-07 15:23:49 +07:00
Gravita
8ac9866258 [FEATURE] SentryProguardUpload 2023-03-07 15:23:20 +07:00
Gravita
47392ceec7 Merge tag 'v5.3.6' into dev
5.3.6 stable
2023-03-07 14:22:28 +07:00
Gravita
c6f8793031 Merge branch 'release/5.3.6' 2023-03-07 14:21:15 +07:00
Gravita
0d74d8a671 Merge branch 'experimental/profiles-rework' into dev 2023-03-03 18:06:35 +07:00
Gravita
70012a2a8f [ANY] 5.3.6 release 2023-03-03 18:00:57 +07:00
Gravita
3821fa7e51 [ANY] Update modules 2023-03-03 16:59:50 +07:00
Gravita
930a5caf74 [ANY] Remove old guard/antiinject support 2023-02-26 19:01:43 +07:00
Gravita
ffad29f53b [FEATURE] Isolate Minecraft: Support add packages to ignore 2023-02-26 18:40:11 +07:00
Gravita
bd4e454be9 Merge branch 'experimental/5.3.0' into experimental/profiles-rework 2023-02-26 18:06:50 +07:00
Gravita
0818b3037c [FEATURE] ClientProfile compat flags, remove deprecated 2023-02-26 18:00:44 +07:00
Gravita
43ffacdf5e [FEATURE] Update Sentry module 2023-02-26 13:12:11 +07:00
Gravita
5c374462ef [FIX] Ping error handle 2023-02-25 19:54:05 +07:00
Gravita
ef5695f679 [ANY] Update modules 2023-02-25 18:43:34 +07:00
Gravita
b4331819cb [FEATURE] Update OptionalView 2023-02-25 18:42:26 +07:00
Gravit
ebf25a65f7
Merge pull request #637 from microwin7/patch-16
[FEATURE] Default value for client profile and assets dir
2023-02-22 16:44:57 +07:00
microwin7
5588b4aac1 [FEATURE] Default value for client profile and assets dir 2023-02-18 07:00:35 +03:00
Gravita
fbaf9ab87f [ANY] Update modules 2023-01-30 20:33:16 +07:00
Gravita
6d1440207b [FIX] Launch4j build exe 2023-01-25 18:02:24 +07:00
Gravita
9d719c48e3 [ANY] Update dependencies 2023-01-24 17:17:03 +07:00
Gravita
b0fba84fbb [FEATURE] MergeAuthCoreProvider 2023-01-20 19:57:14 +07:00
Gravita
1ffd36fc82 Merge tag 'v5.3.5' into dev
5.3.5 stable release
2023-01-15 14:50:37 +07:00
Gravita
9c359747ea Merge branch 'release/5.3.5' 2023-01-15 14:50:21 +07:00
Gravita
2c1972c12c [ANY] 5.3.5 stable 2023-01-15 14:49:20 +07:00
Gravita
d30f0b900b [ANY] Change domain 2023-01-11 18:16:51 +07:00
Tenebrius
f71444b8d6
[FIX] Check openjdk 8 on linux (#632)
* Correct check 8 openjdk on linux

* JRE rt lib in jre/lib/rt.jar

* [fix] remove dev log
2023-01-10 18:14:47 +07:00
Gravita
a0ac58f0b5 [FEATURE] printExperimentalBranch info 2022-12-22 19:11:11 +07:00
Gravita
a27d7f1597 [FEATURE] printExperimentalBranch 2022-12-22 19:07:46 +07:00
Gravita
7aa08c1846 Merge tag 'v5.3.4' into dev
5.3.4 hotfix
2022-12-12 15:15:51 +07:00
Gravita
2045f1ac99 Merge branch 'hotfix/5.3.4' 2022-12-12 15:15:39 +07:00
Gravita
292e7d2af7 [ANY] 5.3.4 hotfix 2022-12-12 15:15:22 +07:00
Gravita
5f7808afff [FIX] MySQLAuthCoreProvider 2022-12-12 15:14:12 +07:00
Gravita
3c10a668de Merge tag 'v5.3.3' into dev
5.3.3 stable
2022-12-09 21:47:43 +07:00
Gravita
ec222aed6f Merge branch 'release/5.3.3' 2022-12-09 21:47:32 +07:00
Gravita
7dcc5aef3f [FIX] More details in error when reading launcher module config file 2022-12-09 21:46:05 +07:00
Gravita
ae994ebb4f [FIX] More safe save config and 5.3.3 2022-12-09 21:34:23 +07:00
Gravita
553cdf5250 [FEATURE] Safe config write 2022-12-09 21:17:07 +07:00
Gravita
0d1b32fc1c [FIX] Save config with postgresql 2022-12-09 20:55:58 +07:00
Gravita
7f4fe566de [FIX] ClassCastException 2022-12-09 20:19:22 +07:00
Gravita
cc825df41e Merge tag 'v5.3.2' into dev
5.3.2 stable
2022-12-09 14:02:28 +07:00
Gravita
dd5ce00c3f Merge branch 'release/5.3.2' 2022-12-09 14:02:19 +07:00
Gravita
7c7952545e [ANY] 5.3.2 release 2022-12-09 14:02:13 +07:00
Gravita
cc8250d6cf [FEATURE] Support 1.19.3 2022-12-09 13:17:45 +07:00
Gravita
3c5e25b67f [FIX] Launcher permissions 2022-12-05 23:17:12 +07:00
Gravita
a0722fb5f4 [FIX] HttpAuthCoreProvider findmulti 2022-12-05 17:22:32 +07:00
Gravita
31b6ae35e7 [FIX] ServerWrapper NPE 2022-11-24 19:52:28 +07:00
Gravita
8fb1349487 [FIX] Roles support 2022-11-21 13:44:58 +07:00
Gravita
5631bc6af1 [FIX] permissionsPermissionColumn 2022-11-21 13:32:10 +07:00
AlexCatze
9cc1810831
[FEATURE] Roles support for MySQL and PostgreSQL (#622)
* [FEATURE] Roles support for MySQL and PostgreSQL

Roles are stored in separate (name,uuid) table. Role can be given to user by adding "role.<name/guid>" permission to user. Permissions can be added to role by adding record with role`s uuid to permissions table.

* [REFACTOR] Refactor roles quering

Use 2 queries, first to query names of all user`s roles, second to recursively query all permissions. This also allows roles inheritance. All code from previous realisation, that is not used in this one, was commented, so if this realisation will be accepted, that code can be finaly removed.

* [REFACTOR] Removed commented code

* [REFACTOR] Remover useless catches
2022-11-19 18:01:32 +07:00
Gravita
841d01b417 [ANY] Use launcher-pack directory for modules 2022-11-18 16:10:28 +07:00
Gravita
a7d3cba949 [FEATURE] Directory launcher-pack 2022-11-18 16:06:42 +07:00
Gravita
b2d2059ebd [ANY] Update modules 2022-11-18 14:47:18 +07:00
Gravita
10888ed2e7 [ANY] Full IDEA reformat 2022-11-18 14:47:03 +07:00
Gravita
82accb211d [ANY] IDEA reformat 2022-11-18 14:39:35 +07:00
Gravita
10df931c2a [FIX] MySQL/PostgreSQL permissions 2022-11-18 14:38:39 +07:00
Gravit
1996525b65
Merge pull request #621 from AlexCatze/feature-sqlabstraction
[FEATURE] Move shared SQL code to abstract class
2022-11-15 13:13:57 +07:00
AlexCatze
40d4681bce [FEATURE] Move shared SQL code to abstract class
Also ports permissions support to MySQL, because it doen`t have PostgreSQL-specific code.
2022-11-14 21:14:53 +02:00
AlexCatze
d11c9e92a5
[FEATURE] Add permissions support to PostgreSQL
This commit adds permissions support to PostgreSQL auth method.
2022-11-13 19:52:20 +01:00
Gravita
60030bd769 [ANY] Update modules 2022-10-30 20:56:32 +07:00
Gravita
bfa9a9c187 [ANY] Update modules 2022-10-30 20:51:43 +07:00
Gravita
a560ab4812 Merge tag 'v5.3.1' into dev
5.3.1 stable
2022-10-23 17:06:00 +07:00
Gravita
a5b4282037 Merge branch 'release/5.3.1' 2022-10-23 17:05:52 +07:00
Gravita
420fd53553 [ANY] 5.3.1 stable 2022-10-23 17:05:38 +07:00
Gravita
1bb7e99e12 [FIX] Paper installAuthlib 2022-10-23 17:00:39 +07:00
Gravita
c74f430129 [FIX] Paper installAuthlib 2022-10-17 00:47:24 +07:00
Gravita
df04b459be [FEATURE] Public getDigest() 2022-10-15 15:21:42 +07:00
Andrew Molchanov
5a0ff3610b
[DOCS] Updating the code of conduct (#616) 2022-10-14 20:11:16 +07:00
Gravita
ca12e7cbd0 [ANY] Update modules 2022-10-07 18:56:09 +07:00
Gravita
6fb9174681 [FEATURE] AuthSupportRemoteClientAccess 2022-10-07 18:55:42 +07:00
Gravita
36d97e7f8b [FEATURE] Profiles refresh 2022-10-01 16:40:19 +07:00
Gravita
28a9b5efc4 [ANY] Update modules 2022-09-28 16:54:16 +07:00
Gravita
86f9f20b52 [FEATURE] BCryptPasswordVerifier 2022-09-28 16:53:56 +07:00
Gravita
8bec134611 Merge tag 'v5.3.0' into dev
5.3.0 stable
2022-09-08 14:09:59 +07:00
Gravita
07be86f695 Merge branch 'release/5.3.0' 2022-09-08 14:09:51 +07:00
Gravita
91f3773c54 [ANY] 5.3.0 stable 2022-09-08 13:45:46 +07:00
Gravita
b2486efb30 [ANY] Update modules 2022-09-08 13:44:11 +07:00
Gravita
970761374a [FEATURE] ArchTrigger 2022-09-04 16:18:33 +07:00
Gravita
b43ff9e7a6 [ANY] 5.3.0 beta 2022-09-04 14:48:00 +07:00
Gravita
c7058499b7 [FIX] EnFS Build 2022-09-04 14:40:13 +07:00
microwin7
6d5ae93889
[FIX] JRE Full Download URL Update (#607)
Which is based on OpenJFX and Minimal VM
2022-09-01 14:04:27 +07:00
Clercq
78e5c8866f
[FEATURE] Injecting certificates to default truststore (#609) 2022-09-01 14:03:40 +07:00
Gravita
692aa8d3cf [ANY] Update modules 2022-08-30 14:26:24 +07:00
Gravita
2324af1c46 [FIX] Bug fixes 2022-08-30 14:26:08 +07:00
Gravita
7414132bad [ANY] Update modules 2022-08-28 13:37:09 +07:00
Gravita
65ae13a042 [FEATURE] MirrorHelper module 2022-08-28 13:36:49 +07:00
Gravita
230194f2a0 [FEATURE] Update rework 2022-08-24 13:41:01 +07:00
Clercq
9bac9e3bef
[FIX] HttpAuthCoreProvider (#603) 2022-08-12 16:22:50 +07:00
Gravita
2d9037fedc [ANY] Support 1.19.2 2022-08-06 00:01:14 +07:00
Clercq
385f2d9ec5
Add to HttpAuthCoreProvider the AuthSupportHardware implementation (#601)
* initial

* test fixes

* review fixes

* review fixes

* test fixes

* review fixes

* review fixes
2022-08-01 15:54:07 +07:00
Gravita
81b80a7938 [FEATURE] Download assets from mojang 2022-07-30 16:15:35 +07:00
Gravita
bbb962c624 [ANY] Add client version 1.19.1 2022-07-28 21:50:55 +07:00
Gravita
eb5bbb9acf [FIX] Compile error 2022-07-26 17:24:14 +07:00
Gravita
3561522d14 [FIX] Remove updateFastCheck 2022-07-26 17:22:34 +07:00
Gravita
c8768326ea [FEATURE] 5.3.0 features 2022-07-24 16:27:24 +07:00
Gravit
dbdc1b4d6a
Merge pull request #600 from microwin7/patch-10
[FIX] Disable Html Escaping
2022-07-21 22:06:41 +07:00
microwin7
d46c380f45
[FIX] Disable Html Escaping 2022-07-21 11:35:13 +03:00
Gravita
6bed8b383d Merge tag 'v5.2.13' into dev
5.2.13 stable release
2022-07-12 15:48:34 +07:00
Gravita
b7a6cfda6d Merge branch 'release/5.2.13' 2022-07-12 15:48:22 +07:00
Gravita
349cec3e40 [ANY] 5.2.13 stable 2022-07-12 15:47:31 +07:00
Gravita
1d349746d3 [ANY] Update dependencies 2022-07-12 15:39:44 +07:00
Gravita
ab7e5ce2f7 [ANY] Update modules 2022-06-29 17:37:00 +07:00
Gravita
afd147f92e [FIX] Small fixes 2022-06-29 17:36:45 +07:00
Gravita
08fe9b2eb4 [FEATURE] InstallAuthlib support 'download-context' 2022-06-19 17:04:44 +07:00
Gravita
bc3c7ba171 [FEATURE] InstallAuthlib command 2022-06-13 19:37:40 +07:00
Gravita
e8d3232dba [ANY] 1.19 support 2022-06-09 17:00:35 +07:00
Gravita
0b38781858 [FIX] HttpAuthCoreProvider small fixes 2022-06-08 23:17:35 +07:00
Gravita
6fac47f99d [ANY] 5.2.13 dev 2022-05-31 17:23:52 +07:00
Gravita
5b8260957a Merge tag 'v5.2.12' into dev
5.2.12 stable
2022-05-31 17:21:39 +07:00
Gravita
1e40ef94e4 Merge branch 'release/5.2.12' 2022-05-31 17:21:29 +07:00
Gravita
63625f0e60 [ANY] 5.2.12 stable 2022-05-31 17:16:15 +07:00
Gravita
6e9ac8af90 [ANY] Update modules 2022-05-31 17:09:19 +07:00
Gravita
44ba945b58 [FEATURE] DebugCommand 2022-05-31 17:07:52 +07:00
Gravit
2c1129aa5b
Merge pull request #587 from microwin7/patch-8
Java recommend don't valid for starting minecraft client
2022-05-29 14:51:15 +07:00
microwin7
3a43ebff45 [FIX][STYLE] Minimal recommend JAVA for 1.18+ set 17 2022-05-29 06:44:25 +03:00
Gravita
857901a667 [FEATURE] Isolate minecraft 2022-05-19 00:38:12 +07:00
Gravita
4ff13a67b9 [FIX] ServerWrapper set start.sh executable 2022-05-18 23:57:21 +07:00
Gravita
c75185f697 [ANY] Update modules 2022-05-13 23:24:54 +07:00
Gravita
5d332a10b5 [FIX] ServerWrapper config args 2022-05-11 22:05:34 +07:00
Gravita
95704fc1bf [FIX] OSSLSignCode 2022-05-02 23:08:30 +07:00
Gravit'a
4400cbe192 [ANY] Update modules 2022-04-18 21:32:30 +07:00
Gravit'a
ccb297a498 [ANY] Update modules 2022-04-18 21:06:48 +07:00
Gravit'a
126d23037e [ANY] Update modules 2022-04-18 20:03:02 +07:00
Gravita
600dd02703 [FIX] JLine complete NPE 2022-04-16 19:16:40 +07:00
Gravita
2ff46420a8 Merge tag 'v5.2.11' into dev
5.2.11 stable
2022-04-12 19:23:56 +07:00
Gravita
9b43592a27 Merge branch 'release/5.2.11' 2022-04-12 19:23:49 +07:00
Gravita
517108deb4 [ANY] 5.2.11 2022-04-12 19:23:28 +07:00
Gravita
83ae8a7e72 [ANY] Remove deprecated 2022-04-12 18:58:14 +07:00
Gravita
bf1967f32b [FIX] ServerWrapper shutdown fix 2022-04-12 18:46:58 +07:00
Gravita
8379a6efec [FIX] Client permissions 2022-04-11 20:43:35 +07:00
Gravita
7ef304c2cc [ANY] 5.2.11-SNAPSHOT 2022-04-11 19:32:39 +07:00
Gravita
8a51c98df8 [ANY] Remove deprecated 2022-04-11 19:28:47 +07:00
Gravita
d128c643ae [ANY] 5.2.1 dev 2022-04-11 17:12:44 +07:00
Gravita
344365d1ef Merge tag 'v5.2.10' into dev
5.2.10 stable
2022-04-11 17:12:21 +07:00
Gravita
7254a197a1 Merge branch 'release/5.2.10' 2022-04-11 17:12:11 +07:00
Gravita
f4280b89f4 [ANY] 5.2.10 stable 2022-04-11 17:11:53 +07:00
Gravita
fa50a6f64c [ANY] Update modules 2022-04-10 23:23:51 +07:00
Gravita
5e6ab3763e [FIX] DiscordBotConsole 2022-04-10 22:14:55 +07:00
Gravit'a
89b800c124 [ANY] Update modules 2022-04-10 01:26:42 +07:00
Gravit'a
b8b841cdd9 [ANY] Update modules 2022-04-09 20:40:58 +07:00
Gravit'a
b614ae6d69 [ANY] Update modules 2022-04-09 18:02:26 +07:00
Gravita
a20b70e2a1 [FEATURE] HttpAuthCoreProvider toString() methods 2022-04-07 22:16:25 +07:00
Gravita
dc27fc04aa [FIX] Forge 1.17+ exit crash 2022-04-07 22:09:20 +07:00
Gravita
2709cbe95f [FIX] getPackageFromClass 2022-04-07 01:39:40 +07:00
Gravita
be565e2218 [FEATURE][EXPERIMENTAL] ServerWrapper launch methods 2022-04-07 01:34:58 +07:00
Gravita
7cedaef90a [ANY] Gradle upgrade 2022-04-03 15:46:59 +07:00
Gravita
b135535147 Upgrade dependencies 2022-04-03 15:44:57 +07:00
Gravita
7cd6b9c1d9 [FIX] Bad login (MySQL + HWID) 2022-04-03 15:08:15 +07:00
Gravita
7bfa4ebdab [FIX] Bad login (MySQL + HWID) 2022-03-30 16:39:48 +07:00
Gravita
8afa630546 [FIX] Bad login (MySQL + HWID) 2022-03-30 15:52:28 +07:00
Gravita
c42f410bc4 [FIX] ServerWrapper main class lookup 2022-03-28 22:44:43 +07:00
Gravita
7522e156ae [ANY] Remove signedClientConfig and securityManagerConfig 2022-03-24 16:51:50 +07:00
Gravita
67a53218d4 [FIX] Old profiles crash 2022-03-24 16:49:50 +07:00
Gravita
b67ae753f0 [ANY] 5.2.10-dev 2022-03-22 15:37:21 +07:00
Gravita
6663f38241 [FEATURE] LwjglDownloadCommand, modules and modulePath 2022-03-22 15:36:26 +07:00
Gravita
e0f291fdac Merge tag 'v5.2.9' into dev
5.2.9 Stable
2022-03-19 16:34:58 +07:00
Gravita
b57118cd20 Merge branch 'release/5.2.9' 2022-03-19 16:34:43 +07:00
Gravita
638ae3d5fe [ANY] 5.2.9-stable release 2022-03-19 16:34:19 +07:00
Gravita
9b3b49966a [FIX] RefreshToken 2022-03-18 20:03:36 +07:00
Gravita
f6ee175acd [FIX] UTC Clock 2022-03-18 19:54:56 +07:00
Gravita
736bf51eaa [FIX] UTC Timezone 2022-03-18 19:50:46 +07:00
Gravita
dd3fd101f4 [FIX] Deprecate Request.session 2022-03-18 19:22:03 +07:00
Gravita
96915b0f78 [FIX] PostgresSQLCoreProvider and HttpAuthCoreProvider bug fixes 2022-03-18 19:02:58 +07:00
Gravita
6430b9e2d4 Merge branch 'feature/removelegacysession' into dev 2022-03-18 18:28:27 +07:00
Gravita
22aa7ad7ae [ANY] 5.2.9-dev 2022-03-18 00:13:27 +07:00
Gravita
922944dacc [ANY] Remove DiscordIntegration 2022-03-18 00:13:16 +07:00
Gravita
a54d7ba89a [FEATURE] PlayerProfile properties, User assets 2022-03-17 23:28:16 +07:00
Gravita
2b117f6717 [FEATURE] UserSupportProperties extension 2022-03-17 22:55:30 +07:00
Gravita
6086b15c9f [FIX] Deprecate RestoreSession 2022-03-17 21:27:08 +07:00
Gravita
d38feed952 [ANY] Update modules 2022-03-17 21:12:44 +07:00
Gravita
62094e0cf6 [FEATURE] Remove legacy session 2022-03-17 21:07:54 +07:00
Gravita
6aed114791 [FEATURE] MySQL and PostgreSQL AuthCoreProvider use OAuth 2022-03-17 20:57:20 +07:00
Gravita
afbed1345f [FEATURE] Support customJvmOptions 2022-03-17 19:30:10 +07:00
Gravit
c351846a43
[FIX] Github Actions compile 2022-03-10 17:19:41 +07:00
Gravit
26835c79bb
Merge pull request #563 from Dbarkovski/patch-4
Support 1.18.2
2022-03-03 19:51:27 +07:00
XuTpbl_JIuC
b72600656a
Support 1.18.2
Support 1.18.2
2022-03-03 11:51:33 +03:00
Gravita
e1f4f76f70 [ANY] Updated modules 2022-02-11 20:38:27 +07:00
Gravita
fecf458e82 [ANY] Remove authlib 2022-02-11 20:38:27 +07:00
Gravit
5fb3a40bbc
Merge pull request #560 from microwin7/patch-5
Update HTTPRequest.java
2022-02-09 19:26:12 +07:00
Gravit
10e7adc4b1
Merge pull request #561 from microwin7/patch-4
Update HTTPRequest.java
2022-02-09 19:25:48 +07:00
microwin7
6c8ba831c2
Update HTTPRequest.java 2022-02-07 12:29:34 +03:00
microwin7
cbeb02950a
Update HTTPRequest.java 2022-02-07 12:24:05 +03:00
Gravit
9b9531ce5e
Merge pull request #553 from microwin7/patch-3
[FIX] MySQL remove limit 1 for update query
2022-01-25 18:21:36 +07:00
microwin7
999d7b7795
[FIX] MySQL remove limit 1 for update query 2022-01-24 09:10:26 +03:00
Gravita
7bfa6f116b Merge tag 'v5.2.8' into dev
5.2.8-stable
2022-01-12 20:46:07 +07:00
Gravita
6ab0c7d6a2 Merge branch 'release/5.2.8' 2022-01-12 20:45:44 +07:00
Gravita
07bfd0b340 [ANY] Update mirror 2022-01-12 20:45:13 +07:00
Gravita
ba0eca5e1f [ANY] 5.2.8 stable 2022-01-12 20:35:36 +07:00
Gravita
788499a45c [FIX] Update modules 2022-01-12 02:15:17 +07:00
Gravita
2b95c58f28 [FIX] MicrosoftAuthCoreProvider 2022-01-12 02:15:01 +07:00
Gravita
4cb47d5891 [ANY] Set default mirror 2022-01-06 23:25:57 +07:00
Gravita
5dd5092957 [ANY] Update dependencies 2022-01-06 23:05:55 +07:00
Gravita
b559655486 [ANY] 5.2.8-dev 2022-01-06 22:25:36 +07:00
Gravita
8945037860 [FIX] InvalidPathException 2022-01-01 22:52:04 +07:00
Gravita
bde9fa958d [ANU] Modules update 2021-12-21 19:53:58 +07:00
Gravita
dd48074e9a [ANY] Update log4j2 2021-12-21 17:26:42 +07:00
Gravita
589477888f [FIX] Remove verifyUsername 2021-12-15 18:37:56 +07:00
Gravita
b496d60b40 [ANY] New client format support, fix fabric 2021-12-13 00:58:38 +07:00
Gravita
8c84a80372 Merge tag 'v5.2.7' into dev
5.2.7
2021-12-11 15:05:01 +07:00
Gravita
3a77a59eac Merge branch 'release/v5.2.7' 2021-12-11 15:04:25 +07:00
Gravita
f3f78b617a [ANY] 5.2.7 stable 2021-12-11 15:04:09 +07:00
Gravita
e40af46e8d [FIX] Remove codeql-analyze 2021-12-11 14:56:12 +07:00
Gravit
c88fb1d8e3
Merge pull request #544 from Dbarkovski/patch-2
Add 1.18.1 support
2021-12-11 14:55:00 +07:00
XuTpbl_JIuC
99812da816
Add 1.18.1 support 2021-12-10 23:26:00 +03:00
Gravita
ce4f4cab62 [FIX] Postgresql no hwidId need 2021-12-10 20:57:21 +07:00
Gravita
796b2e2533 [FEATURE] Postgresql support 2021-12-10 20:46:49 +07:00
Gravit
3b8a01fbb4
Merge pull request #542 from Dbarkovski/patch-1
Fix support ServerWrapper 1.18
2021-12-09 01:18:21 +07:00
XuTpbl_JIuC
9a1498716f
Fix support ServerWrapper 1.18 2021-12-08 17:17:14 +03:00
Gravita
9c289cd1cb [FEATURE] ServerWrapper 1.18 support 2021-12-02 16:45:36 +07:00
Gravit
9cc1cf5feb
Merge pull request #535 from Nalborr/patch-2
Support 1.18
2021-12-01 13:54:55 +07:00
Nalborr
0379477971
Support 1.18 2021-11-30 20:43:51 +02:00
Gravit
9f2c9bb589
Update ClientPermissions.java 2021-11-22 15:00:09 +07:00
Gravita
a8e9418e89 [FIX] OptionalView conflict mods 2021-11-17 23:54:23 +07:00
Gravita
81a94faaf6 [FIX] ServerWrapperSetup javaw.exe 2021-11-17 21:57:51 +07:00
Gravita
559f4f4de7 [FIX] ServerWrapperSetup .bat create 2021-11-17 21:54:51 +07:00
Gravita
3aedd4a2b8 [ANY] 5.2.7-dev 2021-11-17 21:53:46 +07:00
Gravita
d995b3508c [FIX] Client start hotfix 2021-11-17 01:00:31 +07:00
Gravita
4dc79f320d Merge tag 'v5.2.6' into dev
5.2.6-stable
2021-11-16 23:39:52 +07:00
Gravita
84a53304b3 Merge branch 'release/5.2.6' 2021-11-16 23:39:41 +07:00
Gravita
ca943ac24e [ANY] 5.2.6-stable 2021-11-16 23:22:26 +07:00
Gravita
d8d4448f1e [ANY] Gradle 7.3 2021-11-16 23:02:29 +07:00
Gravita
eecd61e6ba [FEATURE] Offline Mode 2021-11-16 23:00:41 +07:00
Gravita
111639b963 [FEATURE] RequestService 2021-11-16 18:32:52 +07:00
Gravita
fbb24bb904 [ANY] Deprecated old features 2021-11-10 23:44:19 +07:00
Gravita
f30daab0f7 [FIX] Proguard jdk dir specified twice 2021-11-10 23:32:26 +07:00
Gravita
50d8f12536 [FIX] Remove HWIDProvider 2021-11-10 23:14:26 +07:00
Gravita
ac1279ff5c [FIX] HttpAuthCoreProvider 2021-11-09 14:32:09 +07:00
Gravita
f8569f9165 [FEATURE] GSON serialize Record 2021-11-09 14:12:31 +07:00
Gravita
2d0957f834 [FIX] MemoryAuthCoreProvider 2021-11-09 12:22:18 +07:00
Gravita
c7cb512710 Merge tag 'v5.2.5' into dev
5.2.5 stable release
2021-11-05 22:26:58 +07:00
Gravita
0640fc6d60 Merge branch 'release/5.2.5' 2021-11-05 22:26:43 +07:00
Gravita
2ef3ca7324 [ANY] 5.2.5 stable 2021-11-05 22:23:59 +07:00
Gravita
2a2c2f6b93 [FEATURE] AuthCoreProvider rework 2021-11-05 22:19:00 +07:00
Gravita
15da924aa6 [FIX] AcceptPasswordVerifier 2021-10-23 17:27:08 +07:00
Gravita
618e981de5 [FIX] AuthProviderPair logger is null 2021-10-18 14:44:35 +07:00
Gravita
e5b603e2a9 [FEATURE] Use UUID for checkServer token 2021-10-17 16:53:33 +07:00
Gravit
7bcf5f10ab
Merge pull request #523 from BartolomeoDR/patch-1
[FIX] Fixed issue where user is unable to play/start the modpack after logout
2021-10-17 12:35:31 +07:00
BartolomeoDR
af2155c4bf
[FIX] Fixed user is unable to play after logout
Right now refCount value is set to 1, and inside handler.setClient its being incremented to 2. Because of that refCount check never goes to 0, and so current session is never stored ( as only single handler has this client, and not two ).
2021-10-16 14:32:57 +03:00
BartolomeoDR
d1bc03664b
Update Client.java
Added ability to customize refCount value of a client
2021-10-16 14:27:48 +03:00
Gravita
b543aaf4a6 Merge tag 'v5.2.4b2' into dev 2021-10-16 00:41:29 +07:00
Gravita
34e5b9027e Merge branch 'hotfix/serverwrapperfail' 2021-10-16 00:40:00 +07:00
Gravita
f3a095966b [ANY] 5.2.4b2 hotfix 2021-10-16 00:39:55 +07:00
Gravita
d99f24c389 [FIX] Invoke mainclass for non-vargs main method 2021-10-16 00:38:52 +07:00
Gravita
2b2aeedc20 Merge tag 'v5.2.4' into dev
5.2.4 stable release
2021-10-15 21:41:46 +07:00
Gravita
39bdab50ca Merge branch 'release/5.2.4' 2021-10-15 21:41:33 +07:00
Gravita
aed103e837 [ANY] 5.2.4 stable 2021-10-15 21:37:02 +07:00
Gravita
1a7160c394 [FIX] Small UI improvements 2021-10-15 21:35:47 +07:00
Gravita
7d8975041f [FIX] Deprecation warning 2021-10-15 21:29:26 +07:00
Gravita
d9a8e161f1 [FEATURE] Improvements for token command 2021-10-15 21:25:27 +07:00
Gravita
b5aeac3ff2 [FIX] Correct error in checkServer 2021-10-15 21:05:26 +07:00
Gravita
2171fb291f [ANY] Обновлены модули 2021-10-14 20:55:23 +07:00
Gravita
8b396dfb13 [ANY] Bug fixes 2021-10-14 20:54:44 +07:00
Gravita
a283f907d6 Merge tag 'v5.2.3' into dev
5.2.3 stable release
2021-10-13 21:44:31 +07:00
Gravita
b48059998f Merge branch 'release/5.2.3' 2021-10-13 21:43:41 +07:00
Gravita
a1ab2d404d [ANY] 5.2.3 stable 2021-10-13 21:43:26 +07:00
Gravita
112ac31803 [FIX] needMoreFactors 2021-10-13 21:28:43 +07:00
Gravita
26ed69e1a7 [FIX] FileAuthSystem module permissions 2021-10-13 20:01:12 +07:00
Gravita
d9b03d3c6a [FIX] Java 17 detect 2021-10-13 14:38:38 +07:00
Gravita
dabe2e8106 [FIX] Ping Server 2021-10-12 17:34:44 +07:00
Gravita
58dfc472ac [FIX] ServerWrapper connect to ServerProfile 2021-10-12 17:09:19 +07:00
Gravita
9841ef3157 [FEATURE] Permissions 2021-10-12 16:55:32 +07:00
Gravita
e782f0409d [ANY] Update modules 2021-09-30 19:55:27 +07:00
Gravita
94a1a2f464 [ANY] Modules update 2021-09-30 19:40:06 +07:00
Gravita
a94b6e8836 [FEATURE][EXPERIMENTAL] Microsoft account support 2021-09-30 19:39:35 +07:00
Gravita
d5cc2ee094 [FIX] FileAuthSystem command 2021-09-30 16:25:39 +07:00
Andrew Molchanov
a1284ff9cb
[FIX] GitHub Actions - Правки и оптимизации (#520)
* [FIX] GitHub Actions - Вернул Release.zip

* [FIX] GitHub Actions - Доработал LauncherBase.zip

Так всё ж куда проще, лол

* [FIX] GitHub Actions - фикс захода в папку

* [FIX] GitHub Actions - Немножко оптимизации
2021-09-27 13:54:27 +07:00
Gravita
baf2997089 [FIX] ProGuard update 2021-09-26 11:40:00 +07:00
Gravita
dfd565d44f [FIX] Bug fixes 2021-09-25 18:46:07 +07:00
Gravita
7a78cbb878 [FIX] ServerWrapper improvements 2021-09-25 18:23:23 +07:00
Gravita
958686a032 [FEATURE][EXPERIMENTAL] New ServerWrapper auth system 2021-09-25 17:40:08 +07:00
Gravita
4c78d00360 [FEATURE] Pattern-based permissions system 2021-09-22 16:50:05 +07:00
Gravita
d2e222d67d [ANY] Обновлены модули 2021-09-22 14:22:36 +07:00
Gravita
39ac6cdad8 [FEATURE] FileAuthSystem improvements 2021-09-22 13:52:17 +07:00
Gravita
4bd84728f3 [REFACTOR] Remove deprecated methods 2021-09-22 13:06:45 +07:00
Gravita
9b55e243e7 [REFACTOR] Remove AuthProvider/AuthHandler support 2021-09-22 12:45:48 +07:00
Gravita
fbbde7991e [REFACTOR] Upgrade to Java 17 2021-09-22 12:19:18 +07:00
Gravita
eec54ad4d9 [FIX] Create release 2021-09-22 11:25:59 +07:00
Gravita
36a6cd7e6a [FIX] Create release 2021-09-22 11:22:13 +07:00
Gravita
1c5a403d69 Merge tag 'v5.2.2' into dev
5.2.2 stable release
2021-09-22 11:16:18 +07:00
Gravita
6c5b02bdb1 Merge branch 'release/5.2.2' 2021-09-22 11:15:55 +07:00
Gravita
3cce0e93f3 [ANY] 5.2.2 stable 2021-09-22 11:15:10 +07:00
Gravita
77b5188b52 [FIX] HashedDir NPE 2021-09-22 11:02:23 +07:00
Gravita
7ab7c29fe4 [FIX] Java 7 found crash 2021-09-22 10:55:35 +07:00
Gravit
04c854703e
Merge pull request #518 from microwin7/patch-1
[FIX] Release Name
2021-09-16 17:48:14 +07:00
microwin7
222cbb2f7b
[FIX] Release Name 2021-09-15 17:29:20 +03:00
Gravita
a09c2dff54 [ANY] Update gradle 2021-09-14 18:06:14 +07:00
Gravita
11af2943db [ANY] Update gradle 2021-09-14 18:05:36 +07:00
Gravita
f0ae4cbb12 [FIX] AuthManager NPE 2021-09-12 17:52:28 +07:00
Gravit
9e7dedffc9
Merge pull request #513 from JoCat/dev
[FIX] GitHub Actions - Загрузка файлов в релиз
2021-09-06 10:02:38 +07:00
Gravit
acf106baa9
Merge pull request #515 from microwin7/dev
Update dependencies and fix HikariCP
2021-09-04 19:59:29 +07:00
Gravita
8694963313 [FIX] TextureProvider NPE error message 2021-09-04 19:54:48 +07:00
microwin7
c44162dbbe [FIX] build.gradle 2021-09-04 09:03:33 +03:00
microwin7
6211744b83 [FIX] build.gradle 2021-09-04 09:02:58 +03:00
microwin7
f279e97ea2 [ANY] Update common modules and FileAuthSystem_module README.md 2021-09-04 08:57:35 +03:00
microwin7
ad5c2382cf [FIX] AdditionalHash_module 2021-09-04 08:54:34 +03:00
microwin7
62991ed709 [FIX] MySQLSourceConfig HikariCP 2021-09-04 08:51:34 +03:00
Gravit
077e6f3053
Merge pull request #514 from microwin7/dev
Update dependencies
2021-09-04 11:45:09 +07:00
microwin7
c0b1373542 Update dependencies 2021-09-04 02:18:31 +03:00
Gravita
12b933c8bd [FIX] Java 11+ get build fix 2021-09-03 22:15:53 +07:00
Gravita
a91a578c58 [ANY] 5.2.2 dev 2021-09-03 21:54:45 +07:00
Gravita
e5cd39e544 [FEATURE][EXPERIMENTAL] JVMHelper.getBuild() 2021-09-03 21:53:27 +07:00
Andrew Molchanov
8b1f0a7d8c
[FIX] GitHub Actions - Немного поправил Prebuild 2021-09-03 16:48:15 +03:00
Andrew Molchanov
fe994cdcca
[FIX] GitHub Actions - Загрузка файлов в релиз 2021-09-03 16:23:51 +03:00
Gravit
438b62b3ca
Merge pull request #512 from JoCat/dev
[FIX] GitHub Actions
2021-09-01 17:57:37 +07:00
Andrew Molchanov
b424da0d62
[FIX] GitHub Actions - получение версии из тега 2021-09-01 13:49:54 +03:00
Andrew Molchanov
6f2f7bee13
[FIX] GitHub Actions 2021-09-01 00:25:40 +03:00
Gravita
5ea3788e7d Merge tag 'v5.2.1' into dev
v5.2.1 Stable
2021-08-31 18:28:18 +07:00
Gravita
92cdaa446e Merge branch 'release/5.2.1' 2021-08-31 18:28:01 +07:00
Gravita
27f7082568 [ANY] 5.2.1 2021-08-31 18:23:40 +07:00
Gravita
effbb18bbc [ANY] Обновлены модули 2021-08-23 15:58:22 +07:00
Gravita
fb7a552843 [FIX] JsonAuthCoreProvider Bearer header 2021-08-23 15:56:08 +07:00
Gravita
93fdd7f899 [ANY] Обновлены модули 2021-08-18 17:27:18 +07:00
Gravita
dc3d75c650 [FIX] getParamsFromUri UTF-8 2021-08-17 15:05:27 +07:00
Gravita
3e973c5de3 [FIX] NPE Issue #506 2021-08-14 03:25:31 +07:00
Gravita
21e92cffc6 [ANY] 5.2.0 stable 2021-08-10 04:50:05 +07:00
Gravita
b7621ef760 [FIX] pro.gravit.launcher.debug 2021-08-10 04:30:55 +07:00
Gravita
2221fadace [FIX] Auth messages 2021-08-10 03:59:04 +07:00
Gravita
214ad8bacb [ANY] Обновлены модули 2021-08-10 03:21:32 +07:00
Gravita
59ca2cb00f [ANY] Обновлены библиотеки 2021-08-10 03:15:21 +07:00
Gravita
a915d41b93 [FIX] JsonAuthCoreProvider joinServer/checkServer 2021-08-08 16:10:07 +07:00
Gravit'a
9fff11e887 [FIX] JsonCoreProvider verifyPassword 2021-08-08 14:53:25 +07:00
Gravit'a
7e77862cd4 [FIX] May be NPE 2021-08-07 11:59:36 +07:00
Gravit'a
5ba36c3a1c [FIX] JavaVersion cache 2021-08-07 11:58:16 +07:00
Gravit'a
1abab46ce4 [FIX] Eclipse and Liberica Java autodetect 2021-08-07 11:52:24 +07:00
Gravit'a
19344b9d27 [FIX] jsonRequest 2021-08-07 03:02:47 +07:00
Tenebrius
0ab9327c74 [ANY] Обновлены модули 2021-08-05 01:20:50 +05:00
Gravita
5f86dc2420 [ANY] Обновлены модули 2021-08-02 08:15:39 +07:00
Gravita
c3d39310b5 [ANY] Обновлены модули 2021-08-02 07:56:23 +07:00
Gravita
902f09324b [FEATURE] MojangCoreProvider 2021-08-02 07:56:01 +07:00
Gravita
aa9b84ba4a [FIX] DialogService 2021-08-02 03:40:09 +07:00
Gravita
711413c52f [FIX] Try fix Downloader cancel() 2021-08-02 02:52:35 +07:00
Gravit'a
9f44673809 [ANY] 5.2.0-beta 2021-08-01 03:11:42 +07:00
Gravita
ce9c13efcc [FIX] DiscordGame fixes 2021-08-01 01:44:21 +07:00
Gravita
3eb69d1284 [ANY] Update modules 2021-07-29 23:36:35 +07:00
Gravita
5d0ccdbde3 [ANY] Update modules 2021-07-27 04:26:18 +07:00
Gravita
4dd30faf7e [FEATURE][EXPERIMENTAL] Support slim skins 2021-07-27 04:26:10 +07:00
Gravita
b0538abe63 [FEATURE] Performance: Skin/Cloak local load 2021-07-27 04:26:10 +07:00
Gravit'a
fecc14010d [FEATURE] IDEA Code Clean 2021-07-21 23:58:58 +07:00
Zaxar163
eb9871123b
[ANY] Небольшой рефактор.
Обнаружил isClient и IS_CLIENT, ещё пару подобных пережитков...
2021-07-21 19:43:47 +03:00
Zaxar163
dfa2b042e4
[FIX] Проблемы с кодировкой в SecurityHelper
Closes #412
2021-07-21 19:14:57 +03:00
Gravit
7ad308cc23
[FIX] Java search in Windows 2021-07-14 00:09:08 +07:00
Gravit
f9c644ff4e
[FIX] Undo changes 2021-07-14 00:07:13 +07:00
Gravit
62e392359d
[FIX] Java search in Windows 2021-07-14 00:06:11 +07:00
Gravita
579fec1518 [ANY] Upgrade gradle to 7.1 2021-07-12 17:31:34 +07:00
Gravita
30ec6409fd [FIX] makeprofile fabric fix 2021-07-11 23:33:31 +07:00
Gravita
1912393a40 [FIX] Download ZIP fix 2021-07-11 23:08:39 +07:00
Gravita
ac15002327 [FEATURE] launcherinstaller forge WIP 2021-07-11 22:46:55 +07:00
Gravita
9112ca0c88 [FEATURE] launcherinstaller fabric 2021-07-11 18:35:36 +07:00
Gravita
3be2452ceb [ANY] Обновлены модули 2021-07-11 17:08:08 +07:00
Gravita
afa0cd0366 [FEATURE] Downloader ProgressBar 2021-07-11 17:07:54 +07:00
Gravita
7f1583c0a3 [ANY] Обновлены библиотеки 2021-07-11 16:00:58 +07:00
Gravita
72e0c55455 [ANY] Обновлены модули+ 2021-07-11 15:36:03 +07:00
Gravita
8085b50b3d [FEATURE] MakeProfileHelper 2021-07-11 15:35:51 +07:00
Gravita
1a8ec31a5b [FEATURE] SYSTEM_ARGS classLoaderConfig 2021-07-11 13:53:40 +07:00
Gravita
b901a5b9e4 [ANY] Support 1.17.1 2021-07-11 13:13:43 +07:00
Gravita
0cc47a7b06 [FIX] JavaHelper Windows 2021-07-09 17:18:29 +07:00
Gravita
736aa93106 [FEATURE] MakeProfileCommand 2021-07-09 15:35:00 +07:00
Gravita
442ff9b752 [FIX] Compilation fix 2021-07-04 22:19:33 +07:00
Gravita
602a4b17f8 [FEATURE] DialogService, AdditionalDataRequest 2021-07-04 20:01:24 +07:00
Gravita
7ca3889bb5 [ANY] 5.2.0-alpha 2021-06-23 11:06:26 +07:00
Gravita
3045619657 [ANY] Small IDEA Code Inspect 2021-06-23 11:06:23 +07:00
Gravita
f82d5dfa03 [ANY] Small IDEA Code Inspect 2021-06-23 11:05:44 +07:00
Gravit'a
27219f7dd7 [FEATURE] DiscordGame support MacOS 2021-06-22 21:10:17 +07:00
Gravita
3f0c972b08 [FEATURE] WhitelistComponent 2021-06-22 12:09:34 +07:00
Gravita
b4718a8062 [FIX] SecurityCheck command 2021-06-22 11:45:04 +07:00
Gravita
81be9d21de [FIX] MySQLCoreProvider HWID fix 2021-06-22 11:13:12 +07:00
Gravit
0c281ab50d
[FIX] Small fixes 2021-06-21 14:14:25 +07:00
Gravit
e36cfea4f9
[FIX] Bad Login (Clientside) in MySQLAuthCoreProvider 2021-06-20 12:01:39 +07:00
Gravit
867f367860
[FIX] Logger.error 2021-06-20 10:42:13 +07:00
Gravit
7133727edd
[FEATURE] Configurable query MySQL AuthCoreProvider 2021-06-20 10:13:53 +07:00
Gravita
c1f1dae7f2 [FIX] FileAuthSystem install init 2021-06-18 17:00:46 +07:00
Gravita
5abc456c3b [FIX] DoubleDigestPasswordVerifier 2021-06-18 16:57:30 +07:00
Gravita
b09cd5c456 [FIX] New trigger system 2021-06-18 11:34:32 +07:00
Gravita
661fb94594 [FIX] Downloader bug fixes 2021-06-18 10:07:00 +07:00
Gravita
d01c27177c [FEATURE] isAllowSave support 2021-06-16 16:35:55 +07:00
Gravita
8ea134dc27 [FIX] AuthCoreProvider checkServer bug fixes 2021-06-15 21:02:33 +07:00
Gravita
9fe1fc4f23 [FEATURE] AuthCoreProvider features 2021-06-15 19:24:28 +07:00
Gravita
201b6826ed [FEATURE] PasswordVerifier encrypt support 2021-06-15 18:24:29 +07:00
Gravit
fbd246a338
Merge pull request #448 from MagTemTenebrius/dev
[Fix] Хеширование
2021-06-14 16:48:41 +07:00
Tenebrius
8c259a7702 [Fix] Хеширование 2021-06-14 14:22:08 +05:00
Tenebrius
781ab27127 [Fix] Хеширование 2021-06-14 13:59:53 +05:00
Gravita
25ddb485ac Merge tag 'vdiscordlink' into dev
v5.1.12
2021-06-13 20:02:18 +07:00
Gravita
0f0d55ef07 Merge branch 'hotfix/discordlink' 2021-06-13 20:01:09 +07:00
Gravita
7ae24071cf [FIX] Discord link hotfix 2021-06-13 20:00:47 +07:00
Gravita
00bbad3451 [FIX] RequestAuthProvider 2021-06-13 17:24:11 +07:00
Gravita
3431fae109 [FEATURE] 1.17 support 2021-06-11 10:14:22 +07:00
Gravita
32a4729970 [FIX] NPE in ClientLauncherEntryPoint 2021-06-09 10:01:07 +07:00
Gravita
8ad6f7ccbe [FIX] Jwts token builder 2021-06-06 00:50:47 +07:00
Gravita
fcdaa36421 [FIX] Jwts token builder 2021-06-06 00:46:39 +07:00
Gravita
1b81d5956c [FIX] Downloader callback bad API 2021-06-05 08:43:43 +07:00
Gravita
5886d1ac48 [FEATURE] Downloader fix 2021-06-05 06:30:56 +07:00
Gravita
314eb8c09e [FEATURE] MySQLCoreProvider support HWID 2021-06-04 06:28:32 +07:00
Gravita
386239bfd7 [FEATURE] More commands 2021-06-04 01:13:12 +07:00
Gravita
80a7e1b593 [ANY] Update modules 2021-06-03 22:52:11 +07:00
Gravita
2d48219f61 [ANY] Update gradle 2021-06-03 22:52:02 +07:00
Gravita
c719f2448e [FEATURE] Updates cache 2021-06-01 05:48:33 +07:00
Gravita
8445ed2dca [FIX] Current Java 9+ javafx selector fix 2021-05-31 08:49:09 +07:00
Gravita
20a326a707 [FIX] CheckServer fix 2021-05-31 08:25:33 +07:00
Gravit
ffad6c0b74
[FIX] Java select 2021-05-31 05:51:40 +07:00
Gravita
a8573c5b57 [FEATURE] New downloader 2021-05-30 01:05:29 +07:00
Gravita
a700ec4ca7 [FIX] encrypted runtime (ZipException: duplicate) 2021-05-29 05:23:29 +07:00
Gravita
617f79cbdd [FIX] RuntimeInClient fixes 2021-05-29 04:42:24 +07:00
Gravita
8290321512 [FIX] RuntimeInClient fixes 2021-05-29 04:42:09 +07:00
Gravita
5920f524c7 [FIX] Java Version search 2021-05-29 03:14:03 +07:00
Gravita
265a872b08 [FIX] Bug fixes 2021-05-28 21:24:06 +07:00
Gravita
73c6c48f42 [FEATURE] AuthSupportHardware 2021-05-28 21:06:14 +07:00
Gravita
568852b951 [FEATURE] AuthSocialProvider 2021-05-28 19:13:16 +07:00
Gravita
6c966b6126 [FIX] WebView auth 2021-05-28 04:40:37 +07:00
Gravita
c2f55998e3 [FIX] JsonCoreProvider 2021-05-25 21:44:25 +07:00
Gravita
5a349afe9d [FIX] JsonCoreProvider: update accessToken 2021-05-25 17:54:45 +07:00
Gravita
be78caa841 [FEATURE] JsonCoreProvider: getDetails 2021-05-25 17:49:22 +07:00
Gravita
fc33ed11d0 [FEATURE] JsonCoreProvider 2021-05-25 17:38:20 +07:00
Gravita
aefb026952 [REFACTOR] Idea Reformat Code 2021-05-25 16:17:36 +07:00
Gravita
cd99641327 [REFACTOR] Idea Reformat Code 2021-05-25 16:17:29 +07:00
Gravita
2c41b510ad [FIX] Bug fixes 2021-05-23 21:46:52 +07:00
Gravita
b7a7156408 [FEATURE] AuthCoreProvider: OAuth Support Part 4 2021-05-23 18:14:57 +07:00
Gravita
ea3310b738 [FEATURE] AuthCoreProvider: OAuth Support Part 3 2021-05-23 17:17:56 +07:00
Gravita
d3751732b0 [FEATURE] AuthCoreProvider: OAuth Support Part 2 2021-05-23 03:22:04 +07:00
Gravita
d1d3f12abd [ANY] Обновлены модули 2021-05-23 02:46:41 +07:00
Gravita
b919020988 [FEATURE] AuthCoreProvider: OAuth Support Part 1 2021-05-23 02:46:31 +07:00
Gravita
f317912de7 [FEATURE] RuntimeInClient Java 9+ 2021-05-22 23:51:46 +07:00
Gravita
c37fb47795 [FIX] AccessToken null 2021-05-21 17:48:29 +07:00
Gravita
e1f356feb7 [FEATURE] Default commands in AuthCoreProvider 2021-05-20 22:35:34 +07:00
Gravita
aa9dc484e1 [ANY] Обновлены модули 2021-05-20 22:00:05 +07:00
Gravita
a8a360be03 [ANY] Обновлены модули 2021-05-20 15:26:00 +07:00
Gravita
96ef860c70 [FIX] MySQLCoreProvider 2021-05-20 02:47:22 +07:00
Gravita
ab7565e7d1 [FIX] AddHashModule PasswordVerifier 2021-05-20 02:27:47 +07:00
Gravita
d9f8b20a71 [FEATURE] PasswordVerifier and MySQLCoreProvider 2021-05-20 02:27:47 +07:00
Gravita
9da0ca8604 [FIX] Sentry modules 2021-05-20 02:27:47 +07:00
Gravita
b5ce3102a9 [FIX] Deprecated warning 2021-05-20 02:27:47 +07:00
Gravita
929a3a4ebb [FIX] GetAvailabilityAuthResponse 2021-05-20 02:27:47 +07:00
Gravita
c40f6f5883 [ANY] Обновлены модули 2021-05-20 02:27:47 +07:00
Gravita
6f6aa81554 [FEATURE] RejectAuthCoreProvider 2021-05-20 02:27:47 +07:00
Gravita
b647f49390 [FEATURE] New Core Auth System 2021-05-20 02:27:47 +07:00
Gravita
97faf5ef79 [FEATURE] Configure projectName and address from env 2021-05-20 02:27:47 +07:00
Gravita
30cabd25fd [FIX] Encrypted Runtime 2021-05-20 02:27:47 +07:00
Gravit
92a6947ab8
Update SaveProfilesCommand.java 2021-05-13 01:20:05 +07:00
Gravita
1667b00757 [FIX] Dockerfile 2021-05-11 01:11:39 +07:00
Gravita
4cd3d145c9 [ANY] Обновлены модули 2021-05-10 15:54:00 +07:00
Gravita
c2b499b2a9 [FEATURE] LogAppender 2021-05-10 15:53:18 +07:00
Gravita
7a1746281d [REFACTOR] Moving to log4j2 logger finally 2021-05-10 14:51:52 +07:00
Gravita
a4596b8c2f [REFACTOR] Moving to log4j2 logger 2021-05-10 14:34:27 +07:00
Gravita
7277aba7ee [FIX] makeProfile fix 2021-05-10 13:52:12 +07:00
Gravita
afe3dd543e [FEATURE] Support mittot/generate option in downloadClient 2021-05-07 20:19:02 +07:00
Gravita
21a203356f [FEATURE] Manual create ClientProfile 2021-05-07 19:25:04 +07:00
Gravita
9f8cd7070c [FIX] Return shuffle in AsyncDownloader 2021-05-07 16:05:56 +07:00
Gravita
43c45f6990 [FIX] DiscordIntegration NPE fix 2021-05-06 01:49:06 +07:00
Gravita
6482ab2c46 [FIX] DiscordIntegration logger fix 2021-05-06 01:31:41 +07:00
Gravita
d837658d36 [FIX] ComponentCommand 2021-05-04 20:28:26 +07:00
Gravita
5b5da76bff [FIX] Crash corrupted sessions.json 2021-05-04 19:39:10 +07:00
Gravita
ea7159dba6 [FEATURE] Print java version in version command 2021-05-04 19:26:00 +07:00
Gravita
f188378fd6 [FEATURE] Print launcher modules in modules command 2021-05-04 19:13:33 +07:00
Gravita
ae82964a24 [FIX] Duplicate profileUUID error 2021-05-04 18:08:13 +07:00
Gravita
e5f714e0f5 [ANY] Обновлены модули 2021-05-02 16:11:06 +07:00
Gravita
abdbf5039d [FIX] OptionalView 2021-05-02 16:10:33 +07:00
Gravita
8ab1dda430 [FIX] Double ProGuard task 2021-04-30 00:39:25 +07:00
Gravita
7724c904e5 [FEATURE] Method getClassLoader() in ClientService 2021-04-30 00:36:43 +07:00
Gravita
d522976f0b [FEATURE] Support icon in notifications 2021-04-30 00:20:10 +07:00
Gravita
a34b2c206b [FEATURE] Support "Runtime in Client" 2021-04-29 23:56:48 +07:00
Gravita
37ec6b525c [FIX] Profile UUID null error 2021-04-29 23:35:56 +07:00
Gravita
1b7e463ddb [FIX] Slf4j detect fix 2021-04-29 22:50:31 +07:00
Gravita
9f05594915 [FEATURE] Profile Settings 2021-04-26 23:22:32 +07:00
Gravita
68d7c0a947 [FEATURE] Support encrypted runtime 2021-04-26 22:21:28 +07:00
Gravita
203fc638dc Revert "[FEATURE] SizedFile Collection shuffle"
This reverts commit 2058e3f38b.
2021-04-23 22:03:28 +07:00
Gravita
2058e3f38b [FEATURE] SizedFile Collection shuffle 2021-04-23 15:46:46 +07:00
Gravita
2def9c20d9 [FIX] Support SPI in Launcher 2021-04-22 21:03:43 +07:00
Gravita
54cb175ae7 [FEATURE] HttpClient in HttpRequest (LauncherCore) 2021-04-18 18:57:02 +07:00
Gravita
5d35c0823e [REFACTOR] Switch to log4j 2 2021-04-18 18:35:46 +07:00
Gravita
66db1eb861 [FEATURE] Arch/Debian openjfx search 2021-04-18 18:03:47 +07:00
Gravita
64661abf0f [ANY] gradle.build 5.2.0-SNAPSHOT 2021-04-15 22:14:09 +07:00
Gravita
5bff221e7e [FEATURE] ClientLauncherWrapper reworked 2021-04-15 22:02:30 +07:00
Gravita
92e2a6c86d [FIX] NPE в clients 2021-04-15 21:02:46 +07:00
Gravita
5bbe63f78c [FIX] Bug fixes 2021-04-14 17:22:07 +07:00
Gravita
7886cce6f8 [FEATURE] Support 2FA in JsonAuthProvider 2021-04-13 21:27:37 +07:00
Gravita
d1e671a935 [FEATURE] AuthDetails support 2021-04-13 19:39:02 +07:00
Gravita
40e4949c47 [FEATURE] Use tmpdir for build 2021-04-13 18:23:39 +07:00
Gravita
5547909c16 [FEATURE][EXPERIMENTAL] LogHelper slf4j bridge 2021-04-13 18:04:00 +07:00
Gravita
3b6997a723 [FEATURE][EXPERIMENTAL] Log4j logging 2021-04-13 16:49:11 +07:00
Gravita
169df2a79a [FEATURE] OAuth type 2021-04-13 14:52:21 +07:00
Gravita
e5e8fa1463 [FIX] ProGuard pipeline fix 2021-04-07 15:48:21 +07:00
Gravita
7015d45088 [FEATURE] AuthRSAPassword AuthAESPassword 2021-04-07 15:20:09 +07:00
Gravita
70c2e1c1af [REFACTOR] Module init refactoring 2021-04-07 14:12:13 +07:00
Gravita
36ea9a9d3d [FEATURE] KeyAgreementManager 2021-04-07 14:00:35 +07:00
Gravita
e9b14c921c [FEATURE] KeyAgreementManager 2021-04-07 14:00:30 +07:00
Gravita
92f19ffc5d [ANY] Обновлены модули 2021-04-06 23:22:55 +07:00
Gravita
6c37dd6ed2 [FEATURE] Version comparing 2021-04-06 22:36:43 +07:00
Gravita
f1331b6d5d [REFACTOR] Mini refactoring 2021-04-06 17:39:14 +07:00
Gravita
1cb2369bfa [FIX] Bug fixes 2021-04-01 00:24:36 +07:00
Gravita
edbed3db1d [FIX] Remove default .crt file 2021-03-30 21:44:19 +07:00
Gravita
dc51ca1c9c [FEATURE] PrepareMode 2021-03-30 16:13:41 +07:00
Gravita
f8af81b141 [FIX] Compile fix 2021-03-27 17:35:12 +07:00
Gravita
fc13442c89 [FEATURE] Updates and profiles sync in new thread 2021-03-27 17:22:46 +07:00
Gravita
63891cd743 [FEATURE] ProGuard Component 2021-03-27 17:22:46 +07:00
Gravita
1452b59fa5 [FIX] Params Parsing 2021-03-27 17:22:46 +07:00
Gravita
0751d2fd28 [FEATURE] RemoteControlModule 2021-03-27 17:22:46 +07:00
Gravita
afc84ebae8 [FEATURE] RemoteControlModule 2021-03-27 17:22:46 +07:00
Gravita
6127e92ce5 [FIX] CommonHelper.newScriptEngine 2021-03-27 17:22:46 +07:00
Gravita
cd5c78c413 [ANY] 5.2.0 dev 2021-03-27 17:22:46 +07:00
Gravita
d7e44700f6 [ANY] Обновлены модули 2021-03-27 17:22:46 +07:00
Gravita
0b1f3f66af [REFACTOR] IDEA Code Reformat 2021-03-27 17:22:46 +07:00
Gravita
3b839da3d3 [ANY] Обновлены модули 2021-03-27 17:22:46 +07:00
Gravita
fb3241dd52 [REFACTOR] IDEA Clean 2021-03-27 17:22:46 +07:00
Gravita
0c97fdf45c [REFACTOR] IDEA Inspect 2021-03-27 17:22:46 +07:00
Gravita
6da27bdf99 [FEATURE] ServerWrapperSetup Agent 2021-03-27 17:22:46 +07:00
Zaxar163
25d88ba30d
Merge pull request #438 from ijo42/patch-1
[STYLE] Опечатка в названии команды
2021-03-21 21:12:24 +03:00
ijo42
155a60053c
[STYLE] Опечатка в названии команды 2021-03-21 15:12:56 +05:00
Gravita
bdd402051a [ANY] Обновлены модули 2021-03-19 23:23:46 +07:00
Gravita
bbdfc204e7 [FEATURE] Support GraphicCard info 2021-03-19 23:23:21 +07:00
Gravita
b545c099eb [FEATURE] Grand libraries update 2021-03-19 23:02:03 +07:00
Gravita
344c61eaee [FEATURE] DebugMain 2021-03-10 00:32:52 +07:00
Gravita
1e7f5c9eb4 [FEATURE] DiscordGame module fix 2021-03-06 17:28:37 +07:00
Gravita
9d06689f35 [FEATURE] CertificateService 2021-03-06 17:19:03 +07:00
Gravit'a
8a016b7d46 [FIX] DiscordGame 2021-02-28 00:59:54 +07:00
Gravit'a
6e54fcd2fb [FIX] DiscordGame fix 2021-02-27 20:16:09 +07:00
Gravita
4baccf5b77 [FIX] OneLauncherModule bug fix 2021-02-27 17:55:07 +07:00
Gravita
0ff47e9339 [FEATURE] DiscordIntegration module 2021-02-27 17:33:53 +07:00
Gravita
3ff39834d8 [FEATURE] OneLauncherModule 2021-02-27 02:57:26 +07:00
Gravita
75a965120a [FEATURE][EXPERIMENTAL] DiscordGame module 2021-02-15 23:42:51 +07:00
Gravita
99fb4002da [ANY] 5.1.11 dev 2021-02-12 21:43:02 +07:00
Gravita
8ff31888e9 Merge tag 'v5.1.10' into dev
5.1.10 Stable
2021-02-12 21:34:27 +07:00
Gravita
610593b0f0 Merge branch 'release/5.1.10' 2021-02-12 21:34:17 +07:00
Gravita
0e505a1feb [ANY] 5.1.10b2 stable 2021-02-12 21:33:49 +07:00
Gravita
b8be6d4ef6 [FEATURE] LaunchServer save command 2021-02-12 21:33:05 +07:00
Gravita
3cd9ddee0d [FIX] autoDump и завершение работы 2021-02-12 21:19:49 +07:00
Gravita
9084361a38 [FIX] Защита от дурака (отсутствие библиотек) 2021-02-12 20:56:55 +07:00
Gravita
f6d954827e [FIX] GitHub Actions 2021-02-08 18:56:26 +07:00
Gravita
7154989827 [FIX] OutOfMemory при скачивании с certificatePinning 2021-02-08 17:58:24 +07:00
Gravita
3ccb0c5c8a [FIX] Оптимизация certificatePinning 2021-02-08 14:42:07 +07:00
Gravita
bca195ca96 [ANY] Release 5.0.10 stable 2021-02-07 22:01:26 +07:00
Gravita
f4ef2b25e1 [ANY] Обновлены модули 2021-02-07 21:58:32 +07:00
Gravita
87cd668522 [ANY] Deprecated AutoSaveSessions API 2021-02-07 21:44:14 +07:00
Gravita
d0f13743ed [FEATURE] Улучшение API Client/FeaturesManager 2021-02-07 21:42:04 +07:00
Gravita
bac794b912 [ANY] Обновлены модули 2021-02-07 21:26:24 +07:00
Gravita
f780db3e57 [FEATURE] Module FileAuthSystem 2021-01-31 02:01:54 +07:00
Gravita
4592eee953 [FEATURE] CertificatePinning, AGENT, min/max/recommend Java and other 2021-01-29 00:13:21 +07:00
Gravita
78265a7576 [FIX] OptionalFile permissions 2021-01-28 19:15:42 +07:00
Gravita
7f86d65d9c [FEATURE] 1.16.5 2021-01-28 19:10:37 +07:00
Gravita
b8ca4daadf [FEATURE] ClientProfile Properties API (issue #433) 2021-01-28 19:08:44 +07:00
Gravita
e2960393fb [ANY] Обновлены модуля 2021-01-14 23:56:39 +07:00
Gravita
84c459bb0d [FIX] PaperSpigot no patch worked 2021-01-14 23:55:55 +07:00
Gravita
4cc22faa55 [ANY] 5.1.10 dev 2021-01-09 21:13:17 +07:00
Gravita
5d39e168cd [FEATURE] Certificate verification refactoring 2021-01-09 21:06:35 +07:00
Gravita
a4927dae4d [FIX] MemorySessionStorage autoDump 2020-12-28 21:39:41 +07:00
Gravita
669a7eb391 [FIX] clientSet & uuidIndex serialize 2020-12-28 21:29:12 +07:00
Gravita
9d6c9c0abf Merge tag 'v5.1.9' into dev
5.1.9 Stable
2020-12-25 11:45:55 +07:00
Gravita
1b2be8389a Merge branch 'release/5.1.9' 2020-12-25 11:45:35 +07:00
Gravita
098a429c13 [ANY] 5.1.9-stable 2020-12-25 11:45:17 +07:00
Gravita
3cf5ee6d2c [FIX] NPE в ProfileByUUIDResponse 2020-12-22 15:41:21 +07:00
Gravita
b897fa55fd [FIX] Invalid field InstantSeconds for get() method, use getLong() instead 2020-12-21 02:38:24 +07:00
Gravita
de95a66742 [FIX] CorruptedWebSocketFrameException: Max frame length of 65536 has been exceeded 2020-12-20 18:12:28 +07:00
Gravita
826eb4c80f [FEATURE] FeaturesResponse and FeaturesRequest 2020-12-20 15:31:17 +07:00
Gravita
cb5535b8ec [FEATURE] FeaturesManager 2020-12-20 15:29:20 +07:00
Gravita
4f5c3370ac [ANY] Dockerfile 2020-12-19 21:24:28 +07:00
Gravita
cafe8df3a9 [FEATURE] final SessionStorage API 2020-12-17 23:56:11 +07:00
Gravita
ce70cab736 [FEATURE] serverName in ServerWrapper 2020-12-17 17:54:28 +07:00
Gravita
62c8ca878e [FIX] SessionStorage NPE 2020-12-17 01:39:24 +07:00
Gravita
aced575921 [FIX] SessionManager NPE 2020-12-16 14:07:46 +07:00
Gravita
c596c30ff6 [ANY] New Sessions system completed 2020-12-15 19:27:38 +07:00
KR33PY
acf2d2d9cd
[FIX] NPE в BatchProfileByUsernameRequest (#424) 2020-12-01 19:44:16 +07:00
Gravit
c24b74ab91
Create codeql-analysis.yml (#423)
* Create codeql-analysis.yml

* Update codeql-analysis.yml
2020-12-01 16:12:16 +07:00
Gravit
08b23db5c6
[FIX] Small fix 2020-11-23 22:30:04 +07:00
Gravit
f971356955
[FEATURE] pingServersCommand 2020-11-22 17:33:37 +07:00
Gravit
06aa6976e0
[FIX] Small fixes 2020-11-22 16:09:54 +07:00
Gravit
2688270fa0
[FEATURE] Advanced Client API 2020-11-21 21:30:21 +07:00
Gravit
5e048905cc
[FEATURE] Netty maxWebSocketRequestBytes 2020-11-21 20:33:10 +07:00
xxDark
ae2ef5e7c2
[FIX] Remove Xms to make peeps stop crying (#422) 2020-11-21 20:10:04 +07:00
Gravit
0f8f51ea97
[FEATURE] SessionManager: uuidIndex 2020-11-21 20:08:39 +07:00
Gravit
447866d001
[FIX] daoObject null 2020-11-08 23:27:23 +07:00
XuTpbl_JIuC
86d3b3365d
[FEATURE] Добавлена поддержка 1.16.4 (#420) 2020-11-03 11:56:38 +03:00
Gravit
fb5609b864
[FIX] ClientProcessLaunchEvent 2020-10-28 01:55:08 +07:00
Gravit
aee051627b
[FIX] NPE in SessionManager 2020-10-28 00:55:32 +07:00
Gravit
94e60c3e51
[FIX] MemoryHWIDProvider 2020-10-27 20:13:31 +07:00
Gravit
18b23b195a
[FEATURE][EXPERIMENTAL] Работа с сессиями 2020-10-26 23:17:05 +07:00
Gravit
3a80a74912
[ANY] Обновлены модули 2020-10-26 21:23:36 +07:00
Gravit
2164fda288
[ANY] Обновлены модули 2020-10-26 20:42:08 +07:00
Gravit
d9e71d08d7
[ANY] 5.1.9-dev 2020-10-26 20:39:39 +07:00
Zaxar163
a1cdd6e22c
[ANY] Обновлены модули. 2020-10-23 19:48:45 +03:00
Gravit
3de3ac24a9
Merge tag 'v5.1.8' into dev
5.1.8 Stable
2020-09-29 01:35:36 +07:00
Gravit
90f360c565
Merge branch 'release/5.1.8' into master 2020-09-29 01:35:23 +07:00
Gravit
a555f1b1d9
[FIX] 5.1.8-stable 2020-09-29 01:32:19 +07:00
Gravit
fe00a62971
[FIX] SecurityCheckCommand fix 2020-09-29 01:08:05 +07:00
Gravit
f9066d1782
[ANY] 5.1.8-dev to 5.1.8-beta 2020-09-27 01:22:00 +07:00
Gravit
326012aad8
[FIX] optionalClientArgs 2020-09-27 00:52:43 +07:00
Gravit
ef3fbaef18
[ANY] IDEA Reformat 2020-09-27 00:49:45 +07:00
Gravit
78c0e0d54d
[FEATURE] Command SecurityCheck 2020-09-26 22:09:25 +07:00
Gravit
438133bce7
[FIX] Потенциальные NPE 2020-09-26 20:13:52 +07:00
Gravit
32d7ca932a
[FIX] Multi-Release 2020-09-26 17:06:51 +07:00
Gravit
f9521b41a2
[FIX] Утечка памяти из за пингов(!) 2020-09-26 17:06:09 +07:00
Gravit
d7519688ee
[FIX][CRITICAL] Замена SimpleDateFormat на thread-safe DateTimeFormatter 2020-09-26 04:01:36 +07:00
Gravit
92df57e491
[FEATURE] Улучшение обработки ошибок websocket 2020-09-26 02:57:42 +07:00
Gravit
584e07328c
[FEATURE][EXPERIMENTAL] NettyThreadFactory 2020-09-26 02:47:19 +07:00
Gravit
3a3aafe5fa
[FEATURE] Улучшение RequestAuthProvider 2020-09-26 02:25:18 +07:00
Gravit
a4355d1d05
[FEATURE] Использование Java 11 по умолчанию 2020-09-26 01:53:44 +07:00
Gravit
9766cd69e5
[ANY] IDEA Reformat 2020-09-25 22:49:43 +07:00
Gravit
8ce5b4179c
[FIX] IDEA Inspect and bug fixes 2020-09-25 22:44:39 +07:00
Gravit
9efcd7af26
[FIX] secp256k1 #414 2020-09-25 17:19:57 +07:00
Gravit
5646813885
[FIX] Ошибка при сериализации инициализированного DaoProvider 2020-09-24 22:07:46 +07:00
Gravit
186a749150
[FIX] Оптимизация 2020-09-17 19:48:11 +07:00
Gravit
5413ba0dd7
[FEATURE] Simple Severlet (велосипедостроение) 2020-09-17 19:40:53 +07:00
Gravit
211b440b8b
[FIX] Server-side pings 2020-09-15 18:10:07 +07:00
Dbarkovski
ddab96f7ea
Update ClientProfile.java (#413)
Добавлена поддержка 1.16.3
2020-09-14 15:06:54 +07:00
Gravit
5835676b7c
[FEATURE][EXPERIMENTAL] Конструктор копирования у OptionalView 2020-09-12 16:49:54 +07:00
Gravit
8b8ef665ef
[FEATURE][EXPERIMENTAL] Потенциальная проблема с зависимостями в опциональных модах 2020-09-12 16:34:09 +07:00
Gravit
72a8325a15
[FEATURE][EXPERIMENTAL] Конвертация опциональных модов в новый формат 2020-09-12 16:12:39 +07:00
Gravit
2271b91653
[FIX][EXPERIMENTAL] Некорректная работа findRecursive при отсутствии конечного HashedEntry 2020-09-12 15:57:03 +07:00
Gravit
b2a3e5672a
[FEATURE][EXPERIMENTAL] Новый API опциональных модов 2020-09-12 13:41:58 +07:00
Gravit
383551229d
[FEATURE] Поддержка HikariCP в HibernateDAO 2020-09-08 21:26:04 +07:00
Gravit
996d126611
[FIX] Забытые конструкторы для API 2020-08-29 14:37:56 +07:00
Gravit
57cdd64142
[FIX] AdvancedProtectHandler сериализация 2020-08-28 19:44:41 +07:00
Gravit
4d17f34ba6
[FIX] ExitResponse 2020-08-27 23:02:40 +07:00
Gravit
886c085572
[FEATURE] Новые типы пароля для поддержки 2FA 2020-08-27 22:50:18 +07:00
Gravit
1362d71788
[FIX] Исправление безопасности 2020-08-27 21:31:11 +07:00
Gravit
4917f19b81
[FEATURE] Улучшение API 2020-08-27 21:25:14 +07:00
Gravit
2e238f3dc2
[FIX] LaunchServer instance в ProtectHandler 2020-08-27 20:39:20 +07:00
Zaxar163
d5bab20610
[ANY] Обновлены модули. 2020-08-24 13:01:51 +03:00
Zaxar163
9a748f0ea3
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-08-24 12:15:01 +03:00
Zaxar163
ea299c4fea
[FIX] Неправильного вывода IP командой clients. Closes #411. 2020-08-24 12:05:24 +03:00
Zaxar163
d98c6c39c5
[FEATURE] JsonHWIDProvider + [FIX] Больше запросы JsonAuthHandler не pretty-print. Closes #410 2020-08-24 12:01:42 +03:00
Gravit
17bce5dff0
[FIX] Username case 2020-08-22 23:22:25 +07:00
Dbarkovski
e3da81bc85
Update ClientProfile.java (#409) 2020-08-14 17:16:34 +07:00
Dbarkovski
46ce073a1f
Update ClientProfile.java (#407)
Добавлена поддержка версии 1.16.2
2020-08-14 16:11:20 +07:00
Gravit
15a0de33ce
[ANY] Обновлены модули 2020-08-12 13:39:16 +07:00
Gravit
e304bd7285
[FEATURE][EXPERIMENTAL] session теперь UUID для совместимости с JS 2020-08-12 13:39:16 +07:00
Gravit
2c8c640130
[FIX] Несколько фиксов NPE 2020-08-12 13:39:15 +07:00
Alexey Zakharov
aa87ff05eb
Обновлена ссылка на Discord (#406)
* Update README.md

* Сокращена ссылка
2020-08-10 13:45:02 +07:00
Gravit
11e50e065c
[ANY] Предупреждение если не сконфигурирована связь с таблицей users 2020-08-02 05:25:39 +07:00
Gravit
1fbad1cfa0
[FEATURE] DirWatcher для params.javaHDir 2020-08-02 05:16:18 +07:00
Gravit
c969b16391
[FIX] Предупреждение об отсутствии JavaFX теперь ошибка 2020-07-24 23:30:08 +07:00
Gravit
48a2a8346a
[FEATURE] Добавление параметра bits к ClientProcess API 2020-07-24 20:39:23 +07:00
Gravit
84617f2fbc
[ANY] 5.1.8-dev 2020-07-22 21:31:24 +07:00
Gravit
db2dffb51c
[ANY] Обновлены модули 2020-07-22 21:28:26 +07:00
Gravit
d4389b9f1f
[FEATURE] Properties в объекте клиента 2020-07-22 21:28:14 +07:00
Gravit
57b0809e56
Merge tag 'v5.1.7' into dev
5.1.7 Stable
2020-07-15 10:58:48 +07:00
Gravit
4b894c3ae1
Merge branch 'release/5.1.7' 2020-07-15 10:58:38 +07:00
Gravit
90ec3efe3d
[ANY] 5.1.7 stable 2020-07-15 10:58:24 +07:00
Gravit
cd890a73ee
[FIX] Альтернативное зеркало и фиксы профилей 2020-07-15 10:54:10 +07:00
Gravit
b92e9a1d29
[FEATURE] SaveProfilesCommand поддержка ServerProfile 2020-07-03 07:38:48 +07:00
Gravit
4bea6bb16b
[FEATURE] PingServerRequest 2020-07-03 07:38:48 +07:00
Andrew Molchanov
6c76e0758d
[FIX] Замена 1.16 на 1.16.1 (#400) 2020-06-30 19:44:18 +07:00
Gravit
3ad7002da7
[FEATURE][EXPERIMENTAL] PingServerReportRequest 2020-06-24 11:06:18 +07:00
Andrew Molchanov
4502f978fb
[ANY] Поддержка 1.16 (#397) 2020-06-23 19:07:43 +03:00
Gravit
07ba1255ce
[FEATURE] defaultClass в сериализации по type 2020-06-22 11:46:22 +07:00
Zaxar163
dd11ba8179
[ANY] Обновлены модули. 2020-06-20 11:58:34 +03:00
Zaxar163
6500b764e9
[ANY] Обновлены модули. 2020-06-18 19:46:40 +03:00
Gravit
926e1534af
[FEATURE] Вывод отладки в поиске Java 2020-06-17 15:54:23 +07:00
Will0376
3e6384cad9
[FEATURE] SyncUPCommand (#396)
* Create SyncAll.java

Выплёвываю как есть. Регистрация где - я хз. Дальше сами.

* Update CommandHandler.java

* Update and rename SyncAll.java to SyncUP.java

* Update CommandHandler.java

* Update and rename SyncUP.java to SyncUPCommand.java

* Update CommandHandler.java
2020-06-17 15:46:08 +07:00
Gravit
09a6afdf57
[FEATURE] Улучшение поиска подходящей Java 2020-06-17 15:32:30 +07:00
Gravit
a65837d81d
[FIX] NPE in MysqlHWIDProvider 2020-06-15 13:23:07 +07:00
Gravit
5b77e4d8fd
[FIX] Поиск подходящей Java 2020-06-15 13:20:34 +07:00
Gravit
12f73aabcb
[ANY] Обновлены модули 2020-06-15 13:18:27 +07:00
Gravit
36786c688d
[FEATURE][EXPERIMENTAL] Поиск подходящей джавы для Windows 2020-06-08 15:45:49 +07:00
Gravit
e7fd749c2f
[FIX] Обращение к AuthHandler'у 2020-06-07 12:52:36 +07:00
Gravit
eca8cc2cbc
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-06-05 08:27:18 +07:00
Gravit
aabd18e089
[FIX] Открытие доступа к UUID и URL скинов и плащей 2020-06-05 08:25:12 +07:00
ijo42
2043d301a1
[FIX] Работа конфигов на русифицированных ОС (#394) 2020-06-04 21:18:12 +02:00
Gravit
dba9d70b37
[FIX] LauncherModuleLoader 2020-06-04 13:28:33 +07:00
Gravit
81abc3fdc2
[FEATURE] Добавлен запрос ServerStatus. Удален execCommand и logListen 2020-05-30 04:06:15 +07:00
Gravit
39f7d4bbda
[ANY] 5.1.7-dev 2020-05-30 00:13:55 +07:00
Gravit
c85e5be4da
Merge tag 'v5.1.6' into dev
v5.1.6-stable
2020-05-30 00:12:53 +07:00
Gravit
ea7d50a8bc
Merge branch 'release/5.1.6' 2020-05-30 00:12:41 +07:00
Gravit
6511207a6e
[ANY] 5.1.6-stable 2020-05-29 23:53:03 +07:00
Gravit
2a9a4256f9
[FIX] NPE in MysqlHWIDProvider 2020-05-29 23:46:12 +07:00
Zaxar163
98431cc796
[ANY] Исправлена ссылка на дискорд канал. 2020-05-28 20:00:44 +03:00
Gravit
898c6a33a1
[FEATURE] Запись последнего HWID в users 2020-05-28 22:50:54 +07:00
Gravit
c353de9267
[FEATURE][EXPERIMENTAL] AuthProviderDAOResult 2020-05-26 04:42:31 +07:00
Gravit
bdecd57470
[FEATURE][EXPERIMENTAL] Переработка DAO/Hibernate 2020-05-26 04:38:47 +07:00
Gravit
c7688afb32
[FIX] NPE в AdvancedProtectHandler 2020-05-26 00:09:01 +07:00
Gravit
72a8c03296
[FEATURE] MysqlHWIDProvider 2020-05-24 03:17:00 +07:00
Gravit
90519f0985
[ANY] J,yjdktys vjlekb 2020-05-24 00:40:12 +07:00
Gravit
73fcf4aae4 [FEATURE] Try recursive LauncherModule configuration 2020-05-20 21:30:33 +07:00
Gravit
fb00adb129
[FIX] HWID banned users 2020-05-18 19:57:12 +07:00
Gravit
3baffcafb5
[FEATURE] HWIDProvider 2020-05-18 19:33:52 +07:00
Gravit
a180673b26
[ANY] 5.1.6 dev 2020-05-08 10:37:08 +07:00
Gravit
d2b82214fb
Merge tag 'v5.1.5' into dev
5.1.5 Stable
2020-05-08 10:32:17 +07:00
Gravit
98f1e30e61
Merge branch 'release/5.1.5' 2020-05-08 10:32:05 +07:00
Gravit
3332faac57
[ANY] 5.1.5 Stable 2020-05-08 10:31:50 +07:00
Gravit
b9d29008ff
[FIX] Compile fix 2020-05-05 10:56:00 +07:00
Gravit
8d1c7621cf
[FEATURE] Улучшение основы для HWID 2020-05-05 10:55:08 +07:00
Gravit
80e919f4a1
[ANY] Проверка на наличие файлов javafx для proguard 2020-05-05 06:40:03 +07:00
Gravit
ca5c435341
[FIX] ClientLauncherCore module in ClientLauncherEntryPoint 2020-05-01 23:56:08 +07:00
Gravit
96d2cfaf26
[FIX] Cyclic dependencies in LaunchServerCore Module 2020-05-01 10:32:35 +07:00
Gravit
4e4f606636
[ANY] Предупреждение при использовании Autogen сертификата 2020-05-01 09:57:14 +07:00
Gravit
19831a6f72
[FIX] GitHub Actions fix 2020-05-01 08:59:09 +07:00
Gravit
f676a5e1cf
[ANY] Обновлены модули 2020-05-01 08:45:45 +07:00
Gravit
65693fa867
[ANY] Обновлены модули 2020-05-01 08:30:36 +07:00
Gravit
7f48772663
[ANY] Обновлены модули 2020-05-01 07:56:58 +07:00
Gravit
4ab66caad0
[ANY] Обновлены модули 2020-04-29 10:57:37 +07:00
Gravit
2f414ae9e7
[ANY] Обновлены модули 2020-04-27 07:45:38 +07:00
Gravit
fe21427d17
[FEATURE] Raw WebSocketFrame API 2020-04-27 05:22:49 +07:00
Gravit
ea5449a196
[ANY] 5.1.5-dev 2020-04-27 04:22:32 +07:00
Gravit
6bee803f00
Merge tag 'v5.1.4' into dev
v5.1.4 Stable
2020-04-27 04:20:42 +07:00
Gravit
aed80e995a
Merge branch 'release/5.1.4' 2020-04-27 04:20:32 +07:00
Gravit
e81b098320
[ANY] 5.1.4-stable 2020-04-27 04:20:15 +07:00
sasha0552
a71b62ca1a
[ANY] Setup "jar filename" - specify for what (#385) 2020-04-24 20:32:08 +03:00
Zaxar163
ac64ec5483 [ANY] Удалены старые файлы. 2020-04-18 09:19:14 +03:00
Zaxar163
ac737c4ccb [FIX] Создаём папки при копировании... 2020-04-18 08:22:25 +03:00
Zaxar163
8a53e5a925
[FIX] Смена директории при помощи DirBridge.move (#374) 2020-04-17 18:37:34 +03:00
Gravit
1abb66fcb8
[ANY] 5.1.4-dev 2020-04-16 21:26:38 +07:00
Zaxar163
85400d968b [FIX] Loop в IOHelper.move 2020-04-14 18:41:49 +03:00
Zaxar163
72232e4cc7 [FIX] Перенос папок в IOHelper. 2020-04-14 18:29:01 +03:00
Zaxar163
6077a51fd4 [ANY] Выводим стектрейс, если DirBridge.move получил аргументом null. 2020-04-14 16:01:10 +03:00
Zaxar163
5ad1d58f62 [REFACTOR] Чистка от неиспользованных констант. 2020-04-13 20:29:13 +03:00
Zaxar163
d06f179e9c Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-04-13 20:16:48 +03:00
Zaxar163
f94766679c [FEATURE] Перенос LauncherModuleLoader в LaunchServer. Поддержка конфигов с субклассами. 2020-04-13 20:16:17 +03:00
Gravit
4e472151e9
Merge pull request #371 from typicalcoder/patch-1
[FIX] Permissions
2020-04-12 21:00:57 +07:00
Gravit
d2ce49e41a [FIX] Missed = 2020-04-12 20:59:24 +07:00
Gravit
4592aeea2d [FEATURE] May be fix old wrapper's 2020-04-12 20:58:00 +07:00
Gravit
c438f08d7a
[FEATURE] Проверка HWID 2020-04-07 19:05:58 +07:00
Gravit
925c1170a3
[ANY] Обновлены модули 2020-04-07 18:17:00 +07:00
Gravit
bf932a4893
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-04-07 18:14:09 +07:00
Gravit
5c5240a2f3
[FEATURE] HWID возвращается 2020-04-07 18:11:58 +07:00
Alexey
ca694601df
[FIX] Permissions 2020-04-05 17:47:21 +03:00
Zaxar163
aa49c60fef [ANY] Обновлены модули. 2020-04-05 17:07:47 +03:00
Zaxar163
c0824a84cd [ANY] Удалены остатки т старой системы сокетов (ещё с 4.xx). + [ANY] Обновлены модули. 2020-04-05 13:46:04 +03:00
Zaxar163
49a2d79ce1 [ANY] Обновлены модули. 2020-04-05 12:01:20 +03:00
Gravit
447e03b999
Merge pull request #370 from GravitLauncher/any/refactor
[ANY] Рефакторинг.
2020-04-05 15:58:33 +07:00
Zaxar163
68c06de23e [FIX] StartLaunchServerTest теперь нормально работает. 2020-04-05 11:30:32 +03:00
Zaxar163
34e941ddfd [ANY] Обновлены модули. 2020-04-05 10:39:56 +03:00
Zaxar163
fd5803ca32 [REFACTOR] Заключительная часть. 2020-04-05 10:32:03 +03:00
Zaxar163
0d5dbe7794 [REFACTOR] Часть 1. 2020-04-05 10:27:04 +03:00
Zaxar163
3ed166f8e7 [FIX] Поддержка нового формата подключения PostgreSQL 2020-04-05 10:20:35 +03:00
Gravit
43a43ec30d
Merge tag 'v5.1.3' into dev
v5.1.3 stable
2020-04-04 20:54:58 +07:00
Gravit
45e3d0b18e
Merge branch 'release/5.1.3' 2020-04-04 20:54:44 +07:00
Gravit
fe59e27bfa
[ANY] 5.1.3 Stable 2020-04-04 20:51:14 +07:00
Gravit
63d9c73e00
[ANY] Обновлены модули 2020-04-04 19:42:22 +07:00
Gravit
3ce38a1b0d
[ANY] Обновлены модули 2020-04-04 19:14:08 +07:00
Gravit
e226cb397d
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-04-04 17:30:26 +07:00
Gravit
c49093cb31
[ANY] Обновлены модули 2020-04-04 17:30:12 +07:00
Zaxar163
0bda3a9dbd [REFACTOR] Удалены все Depcreated. 2020-04-04 10:28:15 +03:00
Gravit
77c797f906
[ANY] Обновлены модули 2020-04-04 13:27:49 +07:00
Gravit
6c873f71c9
[FIX] JavaFX swing library for java 9+ 2020-04-04 13:25:27 +07:00
Gravit
a2ec922d20
[ANY] Обновлены модули 2020-04-03 23:10:16 +07:00
Gravit
95e712e64e
[ANY] Обновлены модули 2020-04-03 19:24:19 +07:00
Gravit
2653a0da89
[ANY] Обновлены модули 2020-04-03 19:14:52 +07:00
Gravit
69ee06727a
[ANY] Обновлены модули 2020-04-03 18:05:42 +07:00
Gravit
e3bc798865
[ANY] Обновлены модули 2020-04-03 17:46:37 +07:00
Gravit
fabb2efe39
[ANY] Обновлены модули 2020-04-03 17:44:58 +07:00
Gravit
30cd1f21f0
[FEATURE] ClientProcessBuilder events 2020-04-03 17:44:25 +07:00
Gravit
eef76a2b4e
[ANY] Обновлены модули 2020-04-03 16:03:49 +07:00
Gravit
7598ba5d62
[FEATURE] New ClientProcess Events 2020-04-03 15:13:49 +07:00
Egor Koleda
edfc248351
Merge pull request #369 from GravitLauncher/feature/actions
Feature/actions
2020-04-01 22:58:30 +03:00
Gravit
775712d898
[FIX] ServerWrapper config auth_id final 2020-04-01 11:24:20 +07:00
Egor Koleda
d2ef0b3aff
[ANY] change cache key suffix (oops) and publish to releases 2020-03-31 18:55:02 +03:00
Egor Koleda
d3c14be4b1
[ANY] remove all other CI's :) 2020-03-31 18:19:52 +03:00
Egor Koleda
1587369ec5
[ANY] added artifacts creation & uploading 2020-03-31 18:00:15 +03:00
Egor Koleda
12583aec89
[ANY] added recursive submodule fetching to actions 2020-03-31 17:49:53 +03:00
Egor Koleda
6125d1c323
[ANY] added actions workflow 2020-03-31 17:43:36 +03:00
Egor Koleda
6dea2f81c0
[ANY] change submodule link type 2020-03-31 17:38:46 +03:00
Gravit
44f3a17973
[FIX] Hibernate reload fix 2020-03-31 11:12:54 +07:00
Gravit
56e1920a8d
[FEATURE][EXPERIMENTAL] Flags in AuthProvider 2020-03-31 10:53:48 +07:00
Gravit
0692fe367f
[FEATURE][EXPERIMENTAL] New permissions system 2020-03-30 10:58:17 +07:00
Gravit
8e1cf303ac
[FEATURE] Update guard interface 2020-03-30 09:52:00 +07:00
Gravit
144b15701b
[FEATURE] getAllUsers fix 2020-03-28 06:43:43 +07:00
Gravit
3201d2fc4f
[FEATURE] SaveProfilesCommand 2020-03-27 12:32:00 +07:00
Gravit
a9867d57c4
[FIX] launch4j build 2020-03-27 10:55:02 +07:00
Gravit
1f8a81ef58
[ANY] Обновлены библиотеки 2020-03-27 10:30:06 +07:00
Gravit
88966edffb
[ANY] 5.1.3 DEV 2020-03-27 10:17:25 +07:00
Gravit
def886b0d6
Merge tag 'v5.1.2' into dev
5.1.2 beta
2020-03-27 10:12:39 +07:00
Gravit
39e3dd77de
Merge branch 'release/5.1.2' 2020-03-27 10:12:29 +07:00
Gravit
64bc2eb3c8
[ANY] 5.1.2 BETA 2020-03-27 10:12:22 +07:00
Gravit
924f3dd958
[FIX] Имена конфигов LauncherModuleLoader 2020-03-27 08:47:40 +07:00
Gravit
98b096dff5
[FIX] More fixes 2020-03-25 13:33:53 +07:00
Gravit
69bd5f3c66
[FIX] ClassCastException 2020-03-23 04:11:51 +07:00
Gravit
00478527e5
[FIX] Частичное удаление упоминаний ClientLauncher 2020-03-22 08:40:14 +07:00
Gravit
fbfb074e0a
[FIX] Критические фиксы 2020-03-22 08:30:29 +07:00
Gravit
c7468eba14
[FEATURE][EXPERIMENTAL] Новое API запуска процесса клиента 2020-03-22 07:44:18 +07:00
Gravit
9ccaf3b1d7
[FIX] Альтернатива whitelist профилей 2020-03-22 04:20:17 +07:00
Gravit
58a208a3f5
[FIX] Удаление whitelist профиля 2020-03-22 03:48:48 +07:00
Gravit
0ddf04b6aa
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-03-22 03:41:34 +07:00
Gravit
56b933bd3a
[FIX] VerifySecureLevelKey 2020-03-22 03:36:52 +07:00
Gravit
7527251841
[FIX] Delete deprecated Client params 2020-03-22 03:24:18 +07:00
Gravit
81d11198e2
Merge pull request #364 from GravitLauncher/scriptsRewrite
[FEATURE] Переписал Gradle скрипты.
2020-03-21 05:40:28 +07:00
Gravit
c57cb90700
[FEATURE][EXPERIMENTAL] SecurityReport 2020-03-20 09:29:30 +07:00
Gravit
8dddb08255
[FEATURE][EXPERIMENTAL] SecureLevel 2020-03-20 08:45:11 +07:00
Gravit
8875146be3
[FEATURE] feature support 2020-03-20 07:43:02 +07:00
Gravit
eddfd61c06
[FIX][EXPERIMENTAL] Вырезание HwidHandler 2020-03-20 06:52:36 +07:00
Gravit
abdb31de90
Merge branch 'feature/newgitlabci' into dev 2020-03-17 05:38:02 +07:00
Gravit
c2154b8a7c
[ANY] Final gitlab CI 2020-03-17 05:32:30 +07:00
Gravit
dc97bbb743
[ANY] Final gitlab ci 2020-03-17 05:15:46 +07:00
Gravit
747e5fec0c
[ANY] Try new gitlab ci 2020-03-17 04:27:09 +07:00
Gravit
602a20325c
[ANY] Try new gitlab ci 2020-03-17 03:24:14 +07:00
Gravit
e26a15d26a
[ANY] 5.1.2 2020-03-15 23:16:31 +07:00
Gravit
de33b458e8
Merge tag 'v5.1.1' into dev
5.1.1 beta
2020-03-15 23:14:38 +07:00
Gravit
79f12edee6
Merge branch 'release/5.1.1' 2020-03-15 23:14:27 +07:00
Gravit
04609c789e
[ANY] 5.1.1 beta 2020-03-15 23:14:05 +07:00
Gravit
d50c306e80
[FIX] MainClass error handling 2020-03-15 03:12:16 +07:00
Zaxar163
d278712183
[FIX] Скрипты сборки. Часть 3/3.
Ещё обновил где возможно версии библиотек.
2020-03-12 06:37:26 +01:00
Zaxar163
b8f25e669e
[FIX] Gradle часть 2/3 2020-03-11 16:40:27 +01:00
Zaxar163
01fa09a115
Merge remote-tracking branch 'origin/dev' into scriptsRewrite 2020-03-11 16:29:23 +01:00
Zaxar163
84543b85f3
[FIX] Hikari and launch4j resolving. 2020-03-11 16:29:17 +01:00
Gravit
1bbaadc5f1
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-03-11 22:18:01 +07:00
Gravit
b40a1497c8
[ANY] Обновлены модули 2020-03-11 22:17:33 +07:00
Zaxar163
665ed6a4f7
[ANY] Обновлены модули. 2020-03-11 16:03:05 +01:00
Zaxar163
606eca22aa
[ANY] Laravel auth controller (#361) 2020-03-05 16:52:19 +01:00
Zaxar163
c44384ccb2
[FEATURE] Laravel auth controller (#360) 2020-03-05 16:39:02 +01:00
Zaxar163
b2888d0cdf
[FEATURE] Laravel migrations (#359) 2020-03-05 15:44:06 +01:00
Gravit
ab9a19d3aa
[FIX] FMLPatcher 2020-03-02 12:26:50 +07:00
Zaxar163
f81e321223
[FEATURE] Храним версии зависимостей в отдельном файле (ч. 1)... 2020-03-01 12:34:31 +01:00
Zaxar163
233e28a08a
[FIX] Фиксы сборки ч. 2. 2020-03-01 10:55:15 +01:00
Zaxar163
1131f56e57
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2020-03-01 10:46:26 +01:00
Zaxar163
ca8f6f0861
[FIX] Обновил gradle. 2020-03-01 10:44:14 +01:00
Gravit
a8b96a2adf
[FIX] 2 NPE 2020-03-01 14:18:54 +07:00
Gravit
6af348606b
[FIX] Реализация Exit 2020-03-01 14:01:57 +07:00
Gravit
437da3de59
[FEATURE] Реализация Exit 2020-03-01 14:00:31 +07:00
Gravit
de47594083
[FIX] Расширенная обработка ошибок NativeJVMHalt 2020-02-28 11:10:40 +07:00
Gravit
ec5c076a16
[FIX] ExitEvent fix 2020-02-25 16:35:33 +07:00
Gravit
28b31d20f9
[ANY] Обновлены модули 2020-02-25 15:28:18 +07:00
Gravit
95924261f3
[ANY] Обновлены модули 2020-02-25 14:08:20 +07:00
Gravit
3f307d7b20
[FEATURE] Откат изменений Захара, конфигурирование лаунчерных модулей 2020-02-25 13:38:11 +07:00
Gravit
308cc48d4c
[ANY] Обновлены модули 2020-02-25 11:08:41 +07:00
Zaxar163
0f9fd46d29
[FIX] Последние варны о несовместимости с Gradle 7.0/ 2020-02-22 05:46:01 +01:00
Zaxar163
3da2951cac
[FIX] Скрипты gradle, окончательно. 2020-02-21 16:46:19 +01:00
Zaxar163
19ac80d449
[FIX] Всё в gradle-скриптах кроме конфигураций compile/testCompile. 2020-02-21 06:20:54 +01:00
Zaxar163
e84530cce4
[FIX] Обновил gradle. 2020-02-21 06:07:33 +01:00
Gravit
5747dd9da0
[ANY] 5.1.1 dev 2020-02-21 11:35:14 +07:00
Gravit
8fa98f362e
Merge tag 'v5.1.0' into dev
v5.1.0 Beta
2020-02-21 11:32:44 +07:00
Gravit
9e9153b124
Merge branch 'release/5.1.0' 2020-02-21 11:32:28 +07:00
Gravit
76ecbaa19e
[ANY] 5.1.0 beta 2020-02-21 11:31:36 +07:00
Gravit
f8aab10609
[FIX] WARN non signed modules 2020-02-21 11:20:18 +07:00
Gravit
a3800958db
[FIX] ConnectionTypes.SERVER deprecated 2020-02-17 08:51:59 +07:00
Gravit
cfc140d47c
[FIX] binaryName fixes and optimize InjectClassAcceptor 2020-02-17 08:35:02 +07:00
Zaxar163
f2c0815123
[FIX] Удаление хранения AuthProvider в [] 2020-02-11 06:08:35 +01:00
Zaxar163
dab4b21ae7
[FIX] Лишний if. 2020-02-10 19:35:48 +01:00
Zaxar163
adefda970e
[FIX] Более быстрое получение провайдера по названий... (коллекция в которой он хранится lasy fill) 2020-02-10 19:18:22 +01:00
Zaxar163
b57ad71539
[REFACTOR] Удалён костыль с сериализацией LauncherEnvironment. 2020-02-10 19:12:47 +01:00
Zaxar163
0e4502d38f
[FIX] Нормальная сериализация Enum. 2020-02-10 19:10:08 +01:00
Zaxar163
bde9fd55f9
[FIX] UOE в сериализации LauncherEnvironment. 2020-02-06 17:27:39 +01:00
Zaxar163
c714a1a5ed
[FIX] Definal 2020-02-01 18:59:16 +01:00
Zaxar163
d68e1f781e
[FIX] NPE в InjectClassAcceptor 2020-02-01 18:17:16 +01:00
Gravit
63ea1f59b0
Merge pull request #355 from GravitLauncher/feature/newProp
[FEATURE] Переход на новое API хранения данных на уровне байткода.
2020-02-01 13:32:16 +07:00
Zaxar163
01b25aa6d8
[AMY] Обновлены модули. 2020-02-01 06:42:41 +01:00
Zaxar163
ff5ed0eb27
[ANY] Немного рефакторинга. 2020-02-01 06:30:04 +01:00
Zaxar163
2a7570b9b6
[FEATURE] Поддержка 1.15.2 2020-01-31 19:27:06 +01:00
Zaxar163
6b7468e366
[FEATURE] Окончательный переход на новую систему props (часть 2).
Список props(текущий тип и значение):
String launcher.projectName; // Название проекта
String launcher.address; // Адрес сервера
int launcher.port; // Порт клиента (рандом) используется для передачи параметров запуска
String launcher.guardType; // Тип защиты (java, wrapper, no и т. д.)
String runtimeconfig.secretKeyClient; // Секретный ключ
String runtimeconfig.oemUnlockKey; // Ключ разблокировки консоли ввода команд в лаунчере...
String runtimeconfig.secureCheckHash; // Проверки безопасности лаунчера (хеш)
String runtimeconfig.secureCheckSalt; // Это же но соль...
String runtimeconfig.passwordEncryptKey; // Ключ для шифровки пароля...
int launchercore.env; // Среда лаунчсервера (0=DEV,1=DEBUG,2=STD,3=PROD, остальное = так же STD)
boolean launcher.isWarningMissArchJava; // Выводить ли предупреждение о os.bits!= java.bits
List<byte[]> launchercore.certificates; // EC-сертификаты в формате byte[]
List<Class<?>> launcher.modules; // Список классов модулей лаунчера.
2020-01-31 19:26:11 +01:00
Zaxar163
554ca54c4a
[FEATURE] Переход на новую систему props часть 1 (будет ещё часть 2). 2020-01-31 19:07:33 +01:00
Zaxar163
002477445c
[ANY] Обновлены модули.
[FEATURE] Синхронизация лишь требуемых директорий в AutoReHash.
2020-01-30 16:46:13 +01:00
Zaxar163
7979989724
[ANY] Удалил старые usePermission + подчистил импорты. 2020-01-30 16:11:39 +01:00
Zaxar163
32f76a395a
[ANY] Обновлены модули. 2020-01-30 15:59:50 +01:00
Zaxar163
ea87e58455
[ANY] Ошибка модификатора поля. 2020-01-30 14:53:21 +01:00
Zaxar163
7b1ddf5577
[FIX] Сериализация short, byte, char, boolean 2020-01-30 14:50:37 +01:00
Gravit
d813e714da
[FIX] InjectClassAcceptor fixes (by radioegor146) 2020-01-30 17:43:07 +07:00
Gravit
83a3c963d3
[FIX] Фиксы MainBuildTask 2020-01-24 10:06:10 +07:00
Gravit
667fb21e9b
[FIX] Фиксы InjectClassAcceptor 2020-01-24 09:57:04 +07:00
Zaxar163
b4a75b9076
[FIX] Поддержка сериализации с аннотацией LauncherInject Map<String, String> 2020-01-22 14:33:08 +01:00
Zaxar163
ef6616dfda
[FIX] InjectClassAcceptor, остался сериализ Map<String, String> 2020-01-22 14:27:10 +01:00
Gravit
6ec2c035cf
[FIX] NPE в ServerWrapper 2020-01-20 12:21:59 +07:00
Gravit
d4c4197e8e
[ANY] Обновлены модули 2020-01-19 13:59:03 +07:00
Gravit
60b7a06fa3
[FIX] final в MysqlHWIDHandler 2020-01-19 13:53:15 +07:00
Gravit
9529017428
[FEATURE] AuthProviderPair линковка 2020-01-19 13:50:48 +07:00
Gravit
f81cdf6440
[FEATURE] Удаление permissionsHandler 2020-01-19 12:22:35 +07:00
Gravit
93436de104
[FEATURE] Новое API сборки лаунчера 2020-01-19 11:38:36 +07:00
Gravit
4260199de7
[FIX] Удаление упоминаний httpclient-x.x.x 2020-01-18 19:51:40 +07:00
Gravit
2119688609
[FEATURE][EXPERIMENTAL] Новое API трансформации классов при сборке 2020-01-18 19:43:53 +07:00
Gravit
c075697316
[FEATURE] Новое API в JarHelper 2020-01-18 18:04:46 +07:00
Gravit
5939ed758f
[ANY] Удаление устаревших классов 2020-01-18 17:33:18 +07:00
Gravit
495dba899d
[FEATURE] ClientUnlockConsoleEvent 2020-01-18 17:25:49 +07:00
Gravit
036b593356
[TEST] Тесты для InjectClassAcceptor 2020-01-18 13:36:13 +07:00
Zaxar163
567e2fefaf
[FIX] Рефакторинг в пакете pro.gravit.launchserver.asm. 2020-01-18 06:25:11 +01:00
Zaxar163
ea6e131b60
[FEATURE] Аннотация LauncherInject и возможность её использования.
Для использования нужен BuildTask по примеру Patcher`а, но с конверсией в классноду и обратно. Чтение класса должно быть с EXPAND_FRAMES, а запись с 0 (без COMPUTE_FRAMES).
2020-01-14 18:01:59 +01:00
Zaxar163
64d57faa48
[FIX] Launch4J - дополнительные настройки. 2020-01-14 17:32:29 +01:00
Zaxar163
770a9a18ce
[FIX] Портирование фиксов с ветки hotfix/5.0.11 2020-01-10 14:55:16 +01:00
Zaxar163
0dcd212d27
[FIX] Более правильное определение ContentType. 2020-01-09 15:35:33 +01:00
Gravit
9351cc1de5
[FEATURE] OptionalTrigger 2020-01-04 22:13:28 +07:00
Gravit
459f305f13
[FEATURE] Возможность слежения за OptionalFile 2020-01-04 22:02:06 +07:00
Gravit
1ae7c80c72
[FIX] Фикс ошибки JavaFX при запуске на Java 9+ без openjfx 2020-01-04 21:54:17 +07:00
Gravit
7d5b912c3c
[FEATURE] ClientService.nativesPath 2020-01-04 21:17:24 +07:00
Gravit
160219c36b
[ANY] Обновлены модули 2020-01-03 17:06:15 +07:00
Gravit Gravit
96930cbce3
[FIX] Autogen Certificate 2020-01-02 22:55:24 +07:00
Gravit Gravit
43e1533c87
[FEATURE][EXPERIMENTAL] New Hibernate DAO 2020-01-02 22:41:05 +07:00
Zaxar163
f0ca39cde9 [ANY] Обновлены модули. 2020-01-02 10:37:33 +03:00
Gravit
284f550a9f
[FIX] CertificateAutogenTask 2019-12-23 11:18:50 +07:00
Gravit
5e923ec479
[FIX] GitLab CI 2019-12-23 11:13:50 +07:00
Zaxar163
decd3a8d04
[ANY] Обновлены модули. 2019-12-19 06:33:03 +01:00
Zaxar163
b617e58a4c
[ANY] Обновлены модули
[FEATURE] Sentry интеграция.
2019-12-19 05:50:49 +01:00
Zaxar163
1e169ce55b
[FIX] Дефолтное значение IGN_OVERFLOW. 2019-12-18 20:01:38 +01:00
Zaxar163
f4dcd99639
[FIX] Игнорируем Overflow (возможен на тяжёлых сборках). 2019-12-18 17:24:07 +01:00
Zaxar163
6f22ae3c7d
[ANY] Обновлены модули 2019-12-18 17:16:48 +01:00
Zaxar163
c6e6dd672f
[FIX] Ещё 1 способ при загрузке группы URL (в основном для модулей). 2019-12-18 17:03:23 +01:00
Zaxar163
c6dad02c9b
[ANY] Обновлены модули. 2019-12-17 15:47:08 +01:00
Zaxar163
011da08dc8
[ANY] Обновлены модули. 2019-12-17 15:40:23 +01:00
Zaxar163
a03bc919a0
[FIX] Поддержка пинга 1.15 2019-12-17 13:37:08 +01:00
Zaxar163
53c8a548f0
[ANY] Небольшой рефакторинг в конфигах. 2019-12-17 06:56:37 +01:00
Zaxar163
9cbdd6300c
[FIX] Выводим больше варнингов в консоль при сборке. 2019-12-17 06:52:53 +01:00
Zaxar163
dcf9a56c01
[ANY] Рефакторинг 2019-12-17 06:46:55 +01:00
Gravit
3bfed5c3c7
[FEATURE] Событие закрытия клиента, сервис обработки exit/setSecurityManager 2019-12-17 11:37:21 +07:00
Gravit
a125fd8e8f
[ANY] Обновлены модули 2019-12-14 12:13:55 +07:00
Gravit
a259527a20
[FIX] Хак для Forge 2019-12-13 09:37:42 +07:00
Gravit
4dcc1443f6
[FIX] Исправления работоспособности клиента 2019-12-12 06:04:52 +07:00
Gravit
5e27db127a
[FEATURE] Проверка сертификата на право подписывать приложения 2019-12-11 10:24:26 +07:00
Gravit
2fc32aa1aa
[FEATURE] StdWebSocketService 2019-12-11 09:15:24 +07:00
Gravit
0922c18b22
[FEATURE] AsyncDownloader теперь стандарт 2019-12-11 08:16:06 +07:00
Gravit
117b95d3fc
[FIX] Исправление optional classpath 2019-12-11 07:59:04 +07:00
Gravit
4779d6e08b
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-12-11 07:54:04 +07:00
Gravit
73e0ed53bb
[FEATURE] Отключение использования javaagent на стороне клиента 2019-12-11 07:53:47 +07:00
Zaxar163
47e5902e94
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-12-09 16:08:23 +01:00
Zaxar163
6f6cb96080
[FIX] Нормальный фикс для FileServer 2019-12-09 16:07:25 +01:00
Gravit
a350b3bd77
[FIX] Перемещение критичных классов в безопастное место 2019-12-09 03:27:13 +07:00
Gravit
4dab77bda9
[FIX] Забытые LauncherNetworkAPI 2019-12-09 02:35:57 +07:00
Gravit
3eef6ac882
[FEATURE][EXPERIMENTAL] Удаление LauncherAPI 2019-12-09 02:28:48 +07:00
Gravit
efc3cd4a09
[FEATURE][EXPERIMENTAL] Исправления для поддержки proguard 2019-12-09 01:37:18 +07:00
Gravit
e673587d60
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-12-09 00:57:26 +07:00
Gravit
9ed4e37e22
[ANY] Обновлены модули 2019-12-09 00:56:48 +07:00
Gravit
38580b23bc
[FEATURE][EXPERIMENTAL] Использование своего ClassLoader'а вместо системного 2019-12-09 00:56:16 +07:00
Zaxar163
4a572d0814
[ANY] Обновлены модули. 2019-12-06 16:49:53 +01:00
Zaxar163
7cbfe93320
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-12-06 16:48:35 +01:00
Zaxar163
f62b037789
[FIX] Встроенный файлсервер не зависит от javax.activation при определении mime-type. 2019-12-06 16:45:07 +01:00
Gravit
b21c8b04c3
[FIX] Некорректный UpdateRequest 2019-12-05 02:25:53 +07:00
Gravit
20913cdbc6
[FIX] Некорректный UpdateRequest 2019-12-05 02:24:19 +07:00
Gravit
71018a0cdf
[FEATURE] UUID в ClientProfile 2019-12-05 01:35:36 +07:00
Gravit
4136f4a6e8
[FEATURE] Удалено большинство настроек, относвщихся к рантайму 2019-12-05 01:22:07 +07:00
Gravit
f839691c87
[ANY] Обновлены модули 2019-12-04 23:49:52 +07:00
Gravit
4eb9c7fe7c
[FEATURE] Удаление apache http client из обязательных библиотек 2019-12-04 23:42:41 +07:00
Gravit
03471e8bbf
[FEATURE] Удаление ListDownloader 2019-12-04 23:08:51 +07:00
Gravit
3296d00249
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-12-04 23:00:47 +07:00
Zaxar163
1086153945
[ANY] Обновлены модули. 2019-12-04 16:58:03 +01:00
Gravit
fd54f4739f
[FEATURE] Удаление лишнего кода 2019-12-04 22:45:24 +07:00
Gravit
94c19c9c56
[FEATURE] Удаление старого runtime 2019-12-04 22:37:29 +07:00
Gravit
40bd92229a
[FEATURE][EXPERIMENTAL] Проверка CodeSign сертификатов 2019-12-04 22:25:17 +07:00
Gravit
cf63e96c1e
[ANY] Обновлены модули 2019-11-30 04:41:47 +07:00
Gravit
773981c32f
[FIX] Возможность отправки сообщений по Channel 2019-11-30 03:47:40 +07:00
Gravit
8c62cfff11
[FIX] Дублирование функций Client.Type и ConnectTypes 2019-11-30 03:25:56 +07:00
Gravit
b93848055b
[FEATURE] connectUUID 2019-11-30 03:12:00 +07:00
Gravit
977f8dfaec
[FEATURE] Магический UUID для отправки RequestEvent без запроса 2019-11-30 02:50:26 +07:00
Gravit
e081bf5a76
[FEATURE] Поддержка 2FA и необычных способах авторизации 2019-11-30 02:41:27 +07:00
Zaxar163
ede1749f58
[ANY] Обновлены модули. 2019-11-29 18:38:45 +01:00
Zaxar163
fe0b4ccf04
[FIX] Когда по ошибке в папке модулей оказывается библиотека, не засыпаем консоль NPE. 2019-11-29 18:31:36 +01:00
Zaxar163
9456c45a3d
[FIX] Небольшая чистка кода ClientLauncher. 2019-11-29 18:20:02 +01:00
Zaxar163
358e92ad9e
[FIX] Переписал код использующий ProccessBuilder. Активные участники прошу работоспособность после этого коммита. 2019-11-28 18:12:40 +01:00
Zaxar163
97b30aa234
[ANY] Рефакторинг. 2019-11-28 18:01:04 +01:00
Zaxar163
af88a02a52
[FIX] Немножко оптимизирован алгоритм генерации dictonary. 2019-11-28 17:42:45 +01:00
Zaxar163
3923251fd2
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-11-28 17:30:10 +01:00
Zaxar163
90d2123f76
[FIX] Автовыбор опций ProGuard для Java9 2019-11-28 17:29:36 +01:00
Gravit
fccc9fe8c0
[FIX](Забытый коммит) Не указывался requestUUID в UpdateResponse 2019-11-28 23:15:28 +07:00
Zaxar163
37e3991a9a
[FEATURE] Адекватная поддержка Docker. 2019-11-28 17:14:06 +01:00
Zaxar163
aa4d4881c8
[FIX] Странная ошибка с MH. 2019-11-25 16:54:27 +01:00
Gravit
05093d8865
[FIX] Исправление Travis CI 2019-11-25 00:53:31 +07:00
Gravit
fc9ac07bc0
[FEATURE] Исправление GitLab CI 2019-11-25 00:38:59 +07:00
Gravit
e9db1b307b
[FEATURE] Multi-Release JAR и компиляция только на Java 11+ 2019-11-25 00:33:18 +07:00
Gravit
178fab6ff7
[FIX] Обновление библиотек до актуальных версий 2019-11-24 22:32:39 +07:00
Gravit
5c39b1d4d2
[FIX] Дополнительные проверки в Auth для защиты от дурака 2019-11-24 19:55:33 +07:00
Gravit
17106886bb
[FIX] NotificationEvent proguard support 2019-11-20 20:49:35 +07:00
Gravit
490ba360e7
[FEATURE] Система уведомлений 2019-11-20 20:42:43 +07:00
Gravit
641001f041
[FIX] Отключен тестовый SecurityManager 2019-11-20 20:07:26 +07:00
Gravit
8730ecb749
[ANY] Обновлены модули 2019-11-20 20:04:41 +07:00
Gravit
0d31257625
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-11-20 20:04:16 +07:00
Gravit
ee955d002c
[FEATURE] New ClientProcessBuilder API 2019-11-20 20:00:23 +07:00
zaxar163
8c1a8235a8 [ANY] Обновлены модули. 2019-11-16 21:17:45 +03:00
zaxar163
a841746ac8 [FIX] Забытые зависимости. 2019-11-16 21:14:28 +03:00
zaxar163
31c32aa2c2 [FIX] Разделение url и пути в ListDownloader. 2019-11-16 20:38:59 +03:00
Zaxar163
6b85de2806
[FIX] В 2 местах убрал рефлексию. 2019-11-15 14:37:43 +01:00
zaxar163
b23b033d19 [FIX] Остатки после удаления агента. 2019-11-10 10:28:10 +03:00
Gravit
3291d2de6b
[FIX] Ускорение запуска путем выключения javaagent на стороне лаунчера 2019-11-10 07:00:22 +07:00
Gravit
0224ce8cd6
[FIX] Фикс final и создания своего runtime 2019-11-09 16:40:08 +07:00
Gravit
35f71f6797
[FIX] Фикс CastException 2019-11-09 11:53:15 +07:00
Gravit
888a3a92d9
[ANY] 5.1.0-dev 2019-10-28 01:31:04 +07:00
Gravit
ead52415fd
Merge branch 'feature/eccrypt' into dev 2019-10-28 01:27:31 +07:00
Gravit
c0b476a494
[FIX] public.key больше не требуется для ServerWrapper 2019-10-28 01:24:09 +07:00
Gravit
085924c831
[FEATURE] Удаление устаревшего TaskUtil 2019-10-27 23:58:44 +07:00
Gravit
5446142e6a
[FEATURE] Раширение pipeline на EXE 2019-10-27 23:51:48 +07:00
Gravit
f3c7f57e50
[FIX] Кривая подпись, испраление тормозов при подписи 2019-10-27 22:39:08 +07:00
Gravit
f7cfaaa543
[FIX] Добавление сгенерированного сертификата в trustStore 2019-10-27 22:33:52 +07:00
Gravit
625fb75f82
[FEATURE] Автогенерация сертификата на лету при его отсутствии 2019-10-27 21:47:55 +07:00
zaxar163
585fb06151 [FIX] XOR изменяющий оригинальный массив. 2019-10-26 20:00:08 +03:00
Gravit
4ccf11f461
Merge branch 'feature/eccrypt' of github.com:GravitLauncher/Launcher into feature/eccrypt 2019-10-26 07:12:37 +07:00
Gravit
02cb32cd65
[FIX] Ошибка при запуске ServerWrapper(ECCryptCipher) 2019-10-26 07:12:08 +07:00
LoomeL
5018e6f35a [ANY] Обновление жабы (#346) 2019-10-24 19:46:11 +03:00
Zaxar163
e55f266b91
[ANY] Рефакторинг. 2019-10-24 15:22:17 +02:00
Zaxar163
5e294d1517
[FIX] А ещё идея в некоторых местах исключения в интерфейсах поела... 2019-10-24 15:19:55 +02:00
Zaxar163
a681f43312
[FIX] Лишний final 2019-10-24 15:18:01 +02:00
Zaxar163
becb12887d
[ANY] Обновлены модули. 2019-10-23 17:45:25 +02:00
Zaxar163
600c65d2f2
[FIX] Ошибка на MAC 2019-10-23 15:23:50 +02:00
Gravit
89c412cda1
[FIX] Не позволяем лаунчеру разжираться слишком сильно 2019-10-23 03:09:47 +07:00
Gravit
e002d1a7e9
[FEATURE] Тестовый SecurityManager для ловли System.exit 2019-10-22 01:13:43 +07:00
Gravit
fb21aeb888
[FEATURE] Подписывание любого файла и любой диретории 2019-10-22 00:12:38 +07:00
Gravit
d40ccf47c7
Merge tag 'v5.0.10' into dev
Stable 5.0.10
2019-10-21 23:09:15 +07:00
Gravit
081b86ff23
Merge branch 'release/5.0.10' 2019-10-21 23:09:07 +07:00
Gravit
2c158135c2
[ANY] 5.0.10 stable 2019-10-21 23:08:47 +07:00
Gravit
fcb52f0eec
[ANY] Обнловлены модули 2019-10-21 23:05:25 +07:00
Gravit
a1e6c80894
[FIX] Фикс mojang авторизации (портирован) 2019-10-21 22:57:37 +07:00
Gravit
ff30ba2670
[FIX] Фикс неработоспособности Mojang авторизации 2019-10-21 22:34:08 +07:00
Gravit
68cb755212
[FIX] Более понятные имена 2019-10-20 23:10:41 +07:00
Gravit
e1c6775e34
[FIX] Ошибки SignJarTask и отключение STRIP для библиотек 2019-10-20 22:55:36 +07:00
Gravit
8f779044fc
Merge branch 'feature/eccrypt' of github.com:GravitLauncher/Launcher into feature/eccrypt 2019-10-20 22:23:02 +07:00
Gravit
72f938333a
[FEATURE] Настраиваемый аллиас файла в манифесте 2019-10-20 22:21:58 +07:00
zaxar163
087e2b5a8c [FEATURE] CryptoHelper 2019-10-20 18:19:27 +03:00
Gravit
d84b13c319
[FEATURE] JarSigner перенесен в основную ветку 2019-10-20 20:40:11 +07:00
zaxar163
f1dcae53b5 [ANY] Обновлены модули 2019-10-20 12:31:18 +03:00
zaxar163
2b87d67e92 [ANY] Обновлены модули. 2019-10-20 09:27:40 +03:00
Gravit
21a90f0540
[ANY] Обновлены модули 2019-10-20 04:13:24 +07:00
Gravit
d8536482ff
[FIX] Обязательная подпись лаунчера 2019-10-20 02:58:05 +07:00
zaxar163
12f5c7ef65 [ANY] Oraganize imports. 2019-10-19 21:21:48 +03:00
zaxar163
cfc63b535e [FIX] Окончательный фикс... 2019-10-19 21:17:51 +03:00
zaxar163
5ed233613f [FIX] Забытый POP... 2019-10-19 21:08:43 +03:00
zaxar163
f5fe5afe81 [FIX] Ошибка компиляции + [FIX] Опкоды static/virtual перепутал 2019-10-19 20:52:20 +03:00
zaxar163
898dcb3ea0 [FIX] Invalid bytecode(1) 2019-10-19 20:50:51 +03:00
zaxar163
8d098108d0 [FIX] Copy-paste shit 2019-10-19 20:45:05 +03:00
zaxar163
908bd1cb76 [FIX] Забытая запись конфига в jar 2019-10-19 20:41:08 +03:00
zaxar163
d9e5e3d350 [FEATURE][EXP] Автогенерация конфига, нужен тест!!! 2019-10-19 20:38:24 +03:00
Gravit
0cab4f254e
[FIX] Доступ из модуля к созданию своих защит 2019-10-19 23:57:23 +07:00
Gravit
b9761637db
[ANY] Чистка LauncherConfig 2019-10-19 23:55:11 +07:00
Gravit
176430e442
[ANY] IDEA Reformat Code 2019-10-19 23:46:16 +07:00
Gravit
9a4b813bb7
[ANY] IDEA Inspect Code 2019-10-19 23:43:33 +07:00
Zaxar163
8ba00d106e
[FIX] Поддержка в ConfigGenerator List<byte[]> 2019-10-19 06:53:13 +02:00
Zaxar163
386a110eb1
[FIX] Забытый RETURN. 2019-10-18 17:11:08 +02:00
Zaxar163
ac55d0694b
[FIX] Удалил по максимому дупликаты кода в LauncherConfigurator. 2019-10-18 17:06:43 +02:00
Zaxar163
0b316dff56
[ANY] Небольшой рефакторинг. 2019-10-18 16:36:38 +02:00
Zaxar163
fd23ba555b
[FEATURE] byte[] в конфиге. 2019-10-18 16:27:47 +02:00
Zaxar163
96d8883ecb
[FEATURE] Переделываю генератор конфига, часть 1 2019-10-18 16:16:06 +02:00
Zaxar163
7ef7099430
Merge branch 'feature/eccrypt' of
github.com:GravitLauncher/Launcher into feature/eccrypt
2019-10-18 16:01:16 +02:00
Zaxar163
d33fe0e6d0
[FIX] Forge 1.14 + [FEATURE] String split для asm. 2019-10-18 15:59:11 +02:00
Gravit
bcbc46238c
[FEATURE] SecureAutogenConfig 2019-10-18 19:10:04 +07:00
Zaxar163
05d5b72d05
[ANY] Обновлены модули. 2019-10-17 18:14:03 +02:00
Zaxar163
cd1a9718de [FEATURE] Фикс ForgeSM через агент. (#342)
* [FEATURE] Фикс завершения работы через агент... Патчим класс форжового SM

* [ANY] Обновлены модули.

* [FIX] Возможность модулям определить, запущены ли они после старта клиента.

* [FIX] Ошибка компиляции.

* [FIX] Ещё 1 способ System.exit в обход SecurityManager.

* [FIX] Фикс патча asm.

* [FIX] FMLPatcher работает!

* [ANY] Обновлены модули.

* [FIX] Немного finalа...

* [ANY] Обновлены модули.

* [ANY] Обновлены модули
2019-10-17 17:37:05 +03:00
Gravit
d897a692f7
[FIX] Фиксы системы сертификатов 2019-10-17 20:58:52 +07:00
Gravit
7c5616ef2b
[ANY] Удаление хлама 2019-10-17 20:29:28 +07:00
Gravit
4c1ba67c71
[ANY] Обновлены модули 2019-10-17 20:23:54 +07:00
Gravit
5a2aedbe06
[FEATURE] LauncherTrustManager и базовые сертификаты 2019-10-17 20:22:24 +07:00
Gravit
8a52340b1a
[FEATURE] Секретная магия 2019-10-17 01:43:40 +07:00
Gravit
a7db7184db
[FIX] Ошибки компиляции 2019-10-17 01:19:14 +07:00
Gravit
80e24715f6
[FEATURE] Подправлены числа сравнения HWID при compareMode 2019-10-16 22:50:35 +07:00
Gravit
cd4e89dc15
[FEATURE] Базовые проверки HWID на лживость 2019-10-16 22:40:36 +07:00
Gravit
f0a235f12c
[FEATURE] Исполнение JS при запуске клиента больше не требуется 2019-10-16 17:55:03 +07:00
Gravit
4a0485d1de
[FEATURE] Ключи у клиента, название папки лаунчера настраивается через projectName 2019-10-16 17:48:36 +07:00
Gravit
35a94ae59f
[FIX] Вырезана лицензия на защиту 2019-10-16 17:08:48 +07:00
Gravit
a84f489f0d
[FIX] Работа без BouncyCastle 2019-10-16 16:58:22 +07:00
Gravit
ce28ac4057
[FEATURE] переход на EC ключи. Отказ от RSA 2019-10-16 16:38:44 +07:00
Gravit
897f799aac
[FIX] Mojang авторизация 2019-10-15 13:52:28 +07:00
Big Energy
a8c407e2fb [FIX] Перепутанная разрядность враппера (#343) 2019-10-11 21:52:30 +07:00
Zaxar163
ef1b61d258
[FIX] Попытка исправить #340 2019-10-10 06:56:18 +02:00
Zaxar163
cb91f83ec2
[FIX] UserAgent в ListDownloader. 2019-10-09 15:33:06 +02:00
Zaxar163
3d7c2f31ef
[FIX] Условие которое никогда не исполнится. 2019-10-09 15:03:59 +02:00
Zaxar163
16fbab7bf5
[FIX] Нормальное API для ClientLauncher. 2019-10-07 17:57:38 +02:00
Zaxar163
331bb42822
[FIX] Нужные для своего paramsHandler поля -> public. 2019-10-07 17:46:39 +02:00
Zaxar163
bb6e635836
[ANY] Обновлены модули. 2019-10-03 19:26:58 +02:00
Zaxar163
6cc3c051cf
[FIX] Авторизация. 2019-10-03 16:03:44 +02:00
Zaxar163
78e882b943
[ANY] Мини-рефакторинг. 2019-10-03 15:04:48 +02:00
Zaxar163
e6333e057f
Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-10-03 14:57:17 +02:00
Zaxar163
30e08e1c26
[ANY] Обновлены модули. 2019-10-03 14:57:03 +02:00
Gravit
f8fbe8e425
[FIX] Duplicate META-INF 2019-09-30 14:01:41 +07:00
Gravit
dda863db9d
[ANY] Обновлены модули 2019-09-30 12:47:18 +07:00
Gravit
81f50a57f3
[FEATURE] Новые фитчи MirrorManager 2019-09-30 10:43:41 +07:00
Gravit
8e1000ec41
[FEATURE][EXPERIMENTAL] Проверка Stacktrace в агента 2019-09-30 08:41:14 +07:00
Gravit
efd58d66c7
[FEATURE] Защита от взлома лаунчера в LauncherRequest 2019-09-29 15:40:26 +07:00
zaxar163
a38853180b [FIX] Дупликаты кода в ClientLauncher, названия хандлеров в LauncherNettyServer 2019-09-29 09:26:04 +03:00
zaxar163
50d5c941f4 [FIX] Названия хандлеров в LauncherNettyServer, удаление лишнего API. 2019-09-28 20:05:03 +03:00
zaxar163
6af7283b60 [FIX] Доступ к NettyServerSocketHandler на postInit... 2019-09-28 19:48:39 +03:00
Zaxar163
f89fabaf11
[FEATURE][EXP] Возможность обрабатывать сообщения WebSocket... 2019-09-27 19:32:24 +02:00
Zaxar163
0ff391778a
[FEATURE][EXP] Возможность зарегестрировать свой алгоритм работы с параметрами. 2019-09-27 19:13:54 +02:00
Gravit
43c96039e4
[FIX] Исправление десериализации в LaunchServer 2019-09-27 07:31:19 +07:00
Gravit
1b5fb36b0a
[FEATURE] Возможность использования кастомных параметров в AuthProvider(OAuth, 2FA и пр) 2019-09-27 07:23:16 +07:00
Gravit
de144d90e0
[ANY] 5.0.10-dev 2019-09-27 06:52:56 +07:00
Gravit
03a636e79a
Merge tag 'v5.0.9' into dev
Release 5.0.9 stable
2019-09-27 06:43:11 +07:00
Gravit
610b6de76f
Merge branch 'release/5.0.9' 2019-09-27 06:42:58 +07:00
Gravit
ac3cde45f0
[ANY] Release 5.0.9 2019-09-27 06:42:43 +07:00
Zaxar163
a3a2b1ac3e
Merge pull request #338 from JoCat/dev
[ANY] Добавил конфиг на 1.14.4 для ванили
2019-09-25 07:00:29 +02:00
Andrew Molchanov
ac42f840a8
[ANY] Добавил конфиг на 1.14.4 для ванили 2019-09-25 00:12:21 +03:00
Zaxar163
b8459c829d
[ANY] Мини-рефакторинг. 2019-09-24 19:44:40 +02:00
Zaxar163
29519728b8
[FIX] 1.14 запуск. 2019-09-24 19:25:49 +02:00
Zaxar163
56bd3f1268
[FIX] Copy-paste. 2019-09-24 18:49:24 +02:00
Zaxar163
29ed4c5cf7
[FIX] Ещё 1 подарочек... 2019-09-24 17:54:22 +02:00
Zaxar163
555c6a6c0b
[FIX] Подарок читерам. 2019-09-24 17:50:48 +02:00
Gravit
dea036a574
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-09-24 14:56:21 +07:00
Gravit
2cfcd7a964
[FIX] Исправление бага с работой runtime с ProGuard 2019-09-24 14:56:00 +07:00
Zaxar163
833cc9ae8e
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-09-23 15:42:34 +02:00
Zaxar163
07c9b9f956
[ANY] Обновлены модули. 2019-09-23 15:42:13 +02:00
Gravit
034e5c154e
[FEATURE] SimpleConfig 2019-09-20 05:21:24 +07:00
Gravit
327d243761
[FIX] Исправление ошибки компиляции 2019-09-20 04:59:53 +07:00
Gravit
d5692bd575
[FEATURE] Новое API для удобной работы с конфигурациями 2019-09-20 04:55:57 +07:00
Gravit
05b214c11a
[FEATURE][FIX] Нормальное API доступа к параметрам при запуске клиента 2019-09-20 04:03:32 +07:00
Gravit
8f42175ad4
[FEATURE] ClientLaunchPhase event 2019-09-20 03:55:34 +07:00
Gravit S
f61cf67606 Merge branch 'dev' into 'dev'
GitLab CI

See merge request gravitlauncherteam/Launcher!284
2019-09-19 20:30:43 +00:00
sasha0552
cc81494e45 GitLab CI 2019-09-19 20:30:43 +00:00
Gravit
f5d7fb435c
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-09-20 03:27:37 +07:00
Gravit
37db7b99a8
[FIX] Опечатка в конфигурации ProGuard 2019-09-20 03:27:02 +07:00
Zaxar163
b8017e38e3
[ANY] Обновлены модули. 2019-09-19 19:30:33 +02:00
Zaxar163
f7ae98e4cb
[ANY] Обновлены модули. 2019-09-19 18:20:15 +02:00
Zaxar163
071230431f
[ANY] Обновлены модули. 2019-09-19 17:38:23 +02:00
Gravit
90bc4343b2
[MODULES] Исправление ServerStatistics и LauncherStartScreen 2019-09-18 04:57:42 +07:00
Gravit
a0e03ca979
[FIX] Фикс PaperSpigot без модуля-патчера 2019-09-18 04:53:03 +07:00
Gravit
6a25d83fbe
[FEATURE] Автоматический поиск модулей JavaFX для Java 9+ 2019-09-18 04:11:13 +07:00
Gravit
c7ae361234
[FEATURE] Включение аргументов JVM специально для Java 9+ 2019-09-18 03:32:57 +07:00
Gravit
0e2c19f79c
[FEATURE] API создания модулей до старта LauncherEngine(Wrapper Phase) 2019-09-18 03:25:59 +07:00
Gravit
e2d3e3068f
[FEATURE] Забытая смена версии 2019-09-18 03:11:45 +07:00
Gravit
053ca39dfe
[FEATURE] API лаунчера, доступное извне без знания о маппингах ProGuard 2019-09-18 02:56:13 +07:00
Gravit
0e278b715b
[FIX] Использование GravitGuard вместе с своей Java 2019-09-18 02:12:55 +07:00
Gravit
06c33a47ad
[FIX] Исправление FileAlreadyExistsException 2019-09-18 02:04:39 +07:00
Zaxar163
b01e52bb17
[FIX] Ошибка компиляции. 2019-09-17 18:37:45 +02:00
Zaxar163
09932de0c0
[FIX] Человекочитабельная ошибка в AdditionalFixesApplyTask. 2019-09-17 18:31:19 +02:00
Zaxar163
5de7eedc35
[FIX] Ещё баги в asm. 2019-09-17 18:14:40 +02:00
Zaxar163
3441fc21a7
[FIX] Annots может быть null 2019-09-17 16:47:32 +02:00
Zaxar163
cc83869725
[ANY] Обновлены модули. 2019-09-17 14:26:10 +02:00
Zaxar163
a10a56a911
[ANY] Обновлены модули. 2019-09-17 14:10:08 +02:00
Zaxar163
45f121c23a
Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-09-17 07:37:00 +02:00
Zaxar163
cd63338db7
[ANY] Обновлены модули. 2019-09-17 07:36:28 +02:00
Gravit
1735cdc0e7
Merge pull request #336 from sanik/dev
[FIX] Исправление использование своей Java с GravitGuard и запуска Gr…
2019-09-17 00:29:50 +07:00
sanik2021
ffe622e0b9
[FIX] Исправление использование своей Java с GravitGuard и запуска GravitGuard на Linux и MacOS. 2019-09-16 20:18:01 +03:00
Zaxar163
f4f329981c
[ANY] Обновлены модули.
Немного нововведений в SimpleObf.
2019-09-16 18:34:08 +02:00
Zaxar163
c17e59c4d1
[FIX] Удаление если прошлая загрузка сорвалась. 2019-09-15 19:41:24 +02:00
Zaxar163
d210666df2
[FIX] Ошибка на обновление. 2019-09-15 19:38:54 +02:00
Zaxar163
22282df126
Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-09-15 19:23:58 +02:00
Zaxar163
d9e4b066da
[ANY] Обновлены модули. 2019-09-15 19:22:30 +02:00
Gravit
a08c11c0ee
Merge tag 'v5.0.8' into dev
Release 5.0.8 stable
2019-09-10 05:40:32 +07:00
Gravit
3ee33b3207
Merge branch 'release/5.0.8' 2019-09-10 05:40:19 +07:00
Gravit
8c07864e12
[ANY] Release 5.0.8 stable 2019-09-10 05:39:56 +07:00
Zaxar163
ba361c007a
[ANY] Обновлены модули. 2019-09-09 17:57:17 +02:00
Gravit
1dab2ed396
[FIX] Удалены отладочные сообщения при использовании Hibernate 2019-09-05 19:45:03 +07:00
Gravit
cf18ce6110
[FIX] Генерация словаря учитывает размер projectName 2019-09-05 19:37:46 +07:00
Gravit
dbc7fa36e7
[FIX] Убрано дублирование кода в LauncherConfigurator 2019-09-05 19:25:53 +07:00
Gravit
709d75eb80
[DOC] Немного правок JavaDoc 2019-09-05 19:09:28 +07:00
Gravit
a91135835a
[FIX] Multiple Definion при использовании ProGuard 2019-09-05 18:51:48 +07:00
Gravit
9fdcdfa915
[FIX] GitLab CI время жизни артифакта 2019-09-05 18:32:09 +07:00
Zaxar163
b43f7c4ed0
[FIX] ShadowJar на assemble (скрипты сборки). 2019-09-04 15:39:12 +02:00
LoomeL
ebda41bbd5 [FEATURE] Простое добавление ссылок без модификации js (#329)
* [FEATURE] Простое добавление ссылок без модификации js

* [ANY] Angelok support

* [FIX] Замена id в styles.css
2019-09-04 20:16:16 +07:00
sasha0552
581b971cc3 [FIX] Hibernate указание диалекта & удаление неактуального скрипта (#333)
* [FIX] Hibernate указание диалекта & удаление неактуального скрипта

* [ANY] Reformat code

* [FIX] Опциональный диалект

* [ANY] Reformat code in hibernate
2019-09-04 20:15:01 +07:00
Zaxar163
a93748b6c6
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-09-01 18:56:57 +02:00
Gravit
aea67ae8ec
[FEATURE] Смена пароля пользователем без участия администратора 2019-09-01 20:25:15 +07:00
Gravit
d9c4cfdbc8
[FEATURE] email при регистрации 2019-09-01 20:12:50 +07:00
Gravit
49e26d0d29
[FIX] Фикс инициализации Guard и ClassCastException 2019-09-01 20:07:23 +07:00
Gravit
988d220f35
[ANY] 5.0.8 dev 2019-08-31 22:38:41 +07:00
Gravit
59e203f4b2
Merge tag 'v5.0.7' into dev
Release 5.0.7 stable
2019-08-31 22:37:16 +07:00
Gravit
da6313e1cc
Merge branch 'release/5.0.7' 2019-08-31 22:36:54 +07:00
Gravit
e9d0ac7f66
[ANY] Release 5.0.7 stable 2019-08-31 22:36:20 +07:00
Gravit
c44ab07bf0
[ANY][DOC] Исправлена документация и обновлены модули 2019-08-31 22:15:42 +07:00
Gravit
115b7e872c
[DOC] Некорректные HTML теги в LauncherModule 2019-08-31 22:03:33 +07:00
Zaxar163
b17c70255f
[ANY] Рефакторинг. 2019-08-31 14:44:43 +02:00
Gravit
7755891139
[ANY] Обновлены модули 2019-08-30 20:58:09 +07:00
Gravit
f90d60b268
[FIX] Ошибка при описании метода в LauncherConfigurator 2019-08-29 21:44:15 +07:00
Gravit
d05ea5e10b
[FIX] Ошибка при описании типа в LauncherConfigurator 2019-08-29 21:29:03 +07:00
Gravit
04f147e368
[FEATURE] Получение модуля по интерфейсу, который он реализовывает 2019-08-29 18:33:27 +07:00
Gravit
08a371f327
[FIX] Исправление extends у LaunchServerPostInitPhase 2019-08-29 18:06:09 +07:00
Gravit
4d9fb827c3
[FIX] Исправление загрузки модуля если внутри папки с модулем имеется мусор 2019-08-29 17:54:06 +07:00
Gravit
f0eeeaad10
[TEST] Тест на запуск лаунчсервера 2019-08-29 17:36:11 +07:00
Gravit
ceff8a8684
[FEATURE] Удаление мусорных файлов, тесты в GitLab CI 2019-08-29 16:46:52 +07:00
Gravit
a09a7c8cf6
[FEATURE] Настройка включения/выключения отображения скрытых файлов при скачке 2019-08-29 16:19:33 +07:00
Gravit
856fe8797d
[FEATURE] Новые состояния модулей 2019-08-28 21:08:24 +07:00
Gravit
f6e2df3e1c
[TEST][FIX] Написаны тесты для CommandHandler/ProviderMap/Modules system. Исправлегы баги, найденные с помощью тестов 2019-08-28 20:30:47 +07:00
Gravit
31356af213
[DOC] Документация к Command/CommandHandler 2019-08-28 18:18:57 +07:00
Gravit
5f6da3a638
[DOC] Документация к AuthProvider/AuthHandler 2019-08-28 17:56:29 +07:00
Gravit
c5d09557da
[DOC] Документация к основным классам LauncherCore 2019-08-28 17:39:01 +07:00
Gravit
79a2881089
[ANY] Переименование JAConfigurator 2019-08-28 17:12:03 +07:00
Gravit
0920fe18f4
[DOC] Документация по новой системе модулей 2019-08-28 16:37:59 +07:00
Gravit
a6e4359216
[FEATURE] Генерация JavaDoc, публикация ServerWrapperAPI 2019-08-28 15:55:58 +07:00
Gravit
afae94cffa
Merge branch 'feature/newmodules' into dev 2019-08-28 15:33:20 +07:00
Gravit
67e293d6aa
[FEATURE] Сортировка модулей по приоритету, удаление устаревших классов 2019-08-28 15:22:57 +07:00
Gravit
40b8e36961
[ANY] Обновление модулей 2019-08-28 14:33:36 +07:00
Zaxar163
04e0b65b4b
[FIX] JAConfigurator 2019-08-28 09:32:43 +03:00
Zaxar163
3c4507b245 Merge branch 'feature/newmodules' of github.com:GravitLauncher/Launcher into feature/newmodules 2019-08-28 09:31:33 +03:00
Zaxar163
b11160f982 [FIX] JAConfigurator 2. 2019-08-28 09:29:32 +03:00
Gravit
47e56828d9
[ANY] Обновление модулей 2019-08-27 13:09:19 +07:00
Zaxar163
a583a6649b [FIX] JAConfigurator 2019-08-26 15:23:23 +03:00
Gravit
68bdf17e03
[FEATURE][EXPERIMENTAL] Исправления JAConfigurator 2019-08-26 18:34:33 +07:00
Gravit
d65d858bc9
[FEATURE][EXPERIMENTAL] Новая система модулей в ServerWrapper и ClientLauncher/LauncherEngine 2019-08-26 18:22:24 +07:00
Gravit
497e07094a
[FIX][EXPERIMENTAL] Исправление неоднозначности InitPhase 2019-08-26 17:37:14 +07:00
Gravit
a980935092
[FEATURE][EXPERIMENTAL] Новая система модулей уже в лаунчсервере 2019-08-26 17:24:19 +07:00
Gravit
114cd2f8c6
[FEATURE][EXPERIMENTAL] LauncherInitContext и возможность инициализации модуля во время работы 2019-08-26 16:42:04 +07:00
Gravit
1646d8b473
[FEATURE][EXPERIMENTAL] Базовая имплементация LauncherModulesManager 2019-08-26 16:27:30 +07:00
Gravit
efa1bf0dd7
[FEATURE][EXPERIMENTAL] Зависимости модулей 2019-08-26 14:42:49 +07:00
Gravit
f316b0598b
[FEATURE][EXPERIMENTAL] Заготовки новой системы модулей 2019-08-26 13:43:53 +07:00
Gravit
867ae334fa
[FEATURE] Большая фитча - переход на LaunchServerBuilder 2019-08-25 16:40:59 +07:00
Gravit
12388226f5
[FEATURE] Перенос LaunchServerConfig в отдельный класс 2019-08-25 14:49:44 +07:00
Gravit
ebfc7351dd
[F] Команда Json*PermissionsHandler - save 2019-08-25 14:34:42 +07:00
Gravit
248450373a
[FEATURE] Команды AbstractLimiter - gc,clear,addExclude,rmExclude, clearExclude 2019-08-25 14:30:14 +07:00
Gravit
82e3ae797c
[FIX][FEATURE] Начальная переработка иницализации лаунчсервера. Фикс инициализации компонентов 2019-08-25 13:48:26 +07:00
Gravit
a30c1db986
[FIX][FEATURE] Исправления Recunfigurable и перенос туда части команд. Исправление reload Лаунчсервера 2019-08-25 13:07:09 +07:00
Gravit
36350cb661
[FEATURE] Reloadable теперь устаревший. Удален ReloadManager 2019-08-25 12:23:01 +07:00
Gravit
9fb3d44d6a
[FEATURE] Упрощение добавления своего HWIDProvider 2019-08-25 12:10:31 +07:00
Gravit
6cc18ec1b8
[FEATURE] ClientHookManager 2019-08-25 12:05:24 +07:00
Zaxar163
c32e6c51db [ANY] Обновлены модули. 2019-08-23 18:06:28 +03:00
Zaxar163
81aaaf6e37 [FIX] LauncherAgent.addJVMClassPath 2019-08-23 13:35:36 +03:00
Egor Koleda
eb9762ce5b [FIX] AutogenConfig VerifyError(#326) 2019-08-22 19:10:28 +03:00
Zaxar163
50433d0b9d [FIX] JaConfigurator if stmt. 2019-08-22 18:42:59 +03:00
Zaxar163
015f15c14f [FIX] Импорты JaConfigurator. 2019-08-22 18:41:50 +03:00
Egor Koleda
b1fb7fa0ab [FIX] JaConfigurator (#325) 2019-08-22 18:39:58 +03:00
Zaxar163
bcbabc4598 [FIX] TABы в скриптах градл. 2019-08-22 14:30:22 +03:00
Zaxar163
e83462018d Merge remote-tracking branch 'orig/master' into dev 2019-08-22 14:21:28 +03:00
Gravit S
185ee359e1 Merge branch 'patch-1' into 'master'
Fix type signatures

See merge request gravitlauncherteam/Launcher!283
2019-08-22 11:13:09 +00:00
Egor Koleda
19b5aabc82 Fix type signatures 2019-08-22 11:04:17 +00:00
Gravit
f087cc5282
[FIX] GitLab CI 2019-08-22 15:03:50 +07:00
Gravit
fef5eac085
[FIX] Исправления скриптов публикации в Maven 2019-08-22 14:36:50 +07:00
Gravit
27423f9f36
Merge tag 'v5.0.6' into dev
Release 5.0.6 stable
2019-08-22 11:37:17 +07:00
Gravit
434fc8af05
Merge branch 'release/5.0.6' 2019-08-22 11:37:00 +07:00
Gravit
3e003780c7
[ANY] 5.0.6 Stable 2019-08-22 11:36:28 +07:00
Gravit
6a22542aeb
[FEATURE] WebSocket pipeline hook 2019-08-22 11:34:12 +07:00
Gravit
163c07c783
Merge pull request #322 from LoomeL/dev
[ANY] Привел config.js в порядок
2019-08-22 11:31:19 +07:00
Zaxar163
e8ba2cc557 [FIX] Удалил JavaAssist из JAConfigurator - для возможности сложной обфускации. 2019-08-21 17:41:27 +03:00
LoomeL
792202c519 [ANY] Window icons 2019-08-21 19:44:24 +06:00
Zaxar163
898a3dd85d [ANY] Обновлены модули
* Добавлен AutoRehash.
2019-08-21 16:34:02 +03:00
Zaxar163
eb765608bd [FIX] Навёл порядок в скриптах gradle. + [FIX] Удалил лишний мусор (остатки старого формата конфигов). + [ANY] Обновлены модули.
[FEATURE] DiscordRPC модуль. + [FIX] Переписал скрипты gradle.
2019-08-21 14:38:54 +03:00
Zaxar163
77101c21ff Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-08-19 12:27:52 +03:00
Zaxar163
a72ed1a48a [ANY] Обновлены модули. 2019-08-19 12:27:08 +03:00
Zaxar163
6788165332 Revert "[ANY] Обновлены модули."
This reverts commit 4edb793f81.
2019-08-19 12:26:58 +03:00
Gravit
b9d3c83314 Revert "[FIX] Убрана зависимость в GameProfile от Apache Common Lang3" 2019-08-19 13:10:27 +07:00
LoomeL
d00b58f4b7 [ANY] Вернул назад DirBridge & фикс комментариев 2019-08-18 22:08:31 +06:00
Zaxar163
4edb793f81 [ANY] Обновлены модули.
* Фикс модуля AddHash
2019-08-18 16:41:06 +03:00
LoomeL
4d7e80c0a0 [ANY] Fix link 2019-08-17 14:42:35 +06:00
LoomeL
95bc0ef53d [ANY] Angelok support 2019-08-17 14:24:17 +06:00
LoomeL
0b682171a2 [ANY] Привел config.js в порядок 2019-08-17 13:52:45 +06:00
Zaxar163
100b0fcda0 Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-08-16 12:49:58 +03:00
Zaxar163
93c1fe20ea [FEATURE] Асинхронная загрузка файлов. 2019-08-16 12:49:45 +03:00
Zaxar163
b4a0bd0daa
Merge pull request #321 from LoomeL/dev
[FEATURE] Изменение оверлея настроек
2019-08-15 19:18:13 +03:00
LoomeL
37dbcf73f7 [FEATURE] Изменение оверлея настроек 2019-08-15 22:10:52 +06:00
Zaxar163
c596838d85
Merge pull request #320 from LoomeL/dev
[ANY] Cut FontAwesome-FX
2019-08-15 19:05:07 +03:00
LoomeL
bc6315391b [ANY] Cut FontAwesome-FX 2019-08-14 16:21:06 +06:00
Zaxar163
ce37be8247
Merge pull request #319 from LoomeL/dev
[ANY] Js/css pretty print
2019-08-14 11:56:02 +03:00
LoomeL
635be61bd9 [ANY] Js/css pretty print 2019-08-14 14:44:35 +06:00
Zaxar163
073b00c58e
Merge pull request #317 from xxDark/dev
Чистка кода
2019-08-14 11:27:33 +03:00
Zaxar163
8f4fb2e94e
Merge pull request #318 from LoomeL/dev
[ANY] Доудаление Jfoenix
2019-08-14 10:27:04 +03:00
LoomeL
b9f76bdf16 [ANY] Доудаление Jfoenix 2019-08-14 13:23:06 +06:00
Zaxar163
94a00ccab8 [ANY] Разобран завал со скриптами сборки. 2019-08-14 09:53:30 +03:00
xDark
2a975d749c [FIX] Исправление граматики 2019-08-13 22:16:57 +03:00
xDark
0524e77e3e [ANY] Чистка кода x2 2019-08-13 22:11:51 +03:00
xDark
7d279da5af [ANY] Чистка кода 2019-08-13 21:02:33 +03:00
Zaxar163
6a590eb922
Merge pull request #316 from xxDark/dev
[FIX] Убрана зависимость в GameProfile от Apache Common Lang3
2019-08-13 19:56:51 +03:00
xDark
d80ffb28f2 [FIX] Убрана зависимость в GameProfile от Apache Common Lang3 2019-08-13 19:52:02 +03:00
Zaxar163
ecd5a24ea5 [ANY] Обновлены модуль
* [FEATURE] SimpleObf - простейший обфускатор.
2019-08-13 19:14:17 +03:00
Gravit
ed239cc3c2
[FIX] Функциональность сертификатов обернута 2019-08-13 21:13:51 +07:00
Gravit
d0c16f2835
[FEATURE] ServerStatisticsModule 2019-08-13 21:03:17 +07:00
Zaxar163
24f9c05e14 [FIX] Нормальный, конфигурабельный фикс maven-publish. 2019-08-13 15:39:23 +03:00
Zaxar163
3f6eb3156d [ANY] Навёл порядок в скриптах сборки. 2019-08-13 15:20:10 +03:00
Zaxar163
2eb994f313 [FEATURE] Поддержка PostgreSQL! 2019-08-13 15:10:23 +03:00
Zaxar163
884b82deb8 [ANY] Рефакторинг (Organize imports). 2019-08-13 14:58:56 +03:00
Zaxar163
50a9d96f71 [FIX] Починил публикацию в скриптах gradle. 2019-08-13 14:49:41 +03:00
Gravit
8b71025896
[FEATURE] Подпись файлов при публикации в Maven 2019-08-13 03:20:28 +07:00
Gravit
d20cf39e89
[FEATURE] Настроена отправка артефактов в Maven 2019-08-11 01:53:12 +07:00
Zaxar163
7c0cf17da3 [FIX] Чистый jar лаунчсервер`а. 2019-08-10 18:51:23 +03:00
Gravit
0d8fb149fb
[FIX] Исправление javassist.CannotCompileException и java.util.zip.ZipException: duplicate entry в LauncherModuleLoader 2019-08-10 22:16:12 +07:00
Gravit
e7f6b6f3f5
[FIX] Человекочитаемая ошибка при обнаружении мусора в modules 2019-08-10 18:37:05 +07:00
Gravit
ffadb6abff
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-08-10 01:23:55 +07:00
Gravit
95fd04ca91
[FEATURE] Модуль LauncherModuleLoader 2019-08-10 01:23:24 +07:00
Gravit
71a08fe96a
[FEATURE] Возможность дерегистрации ClientModuleClass 2019-08-10 01:22:56 +07:00
Gravit
fd21033fef
Merge pull request #314 from LoomeL/dev
[FEATURE] Вывод версии лаунчера и java в отладку
2019-08-10 00:05:46 +07:00
Gravit
7f441ad98e
[FIX] Условие AUthLimiter/RegLimiter было случайно инвертировано 2019-08-10 00:01:43 +07:00
LoomeL
fc0d3abf6d [FEATURE] Вывод версии лаунчера и java в отладку 2019-08-09 22:51:10 +06:00
Gravit
45b6f64cd7
[FEATURE] AbstractLimiter, переделка AuthLimiter и RegLimiter 2019-08-09 23:28:08 +07:00
Gravit
ca19734a88
[FEATURE] Параметры, относящиеся к сборке лаунчера перенесены в раздел launcher 2019-08-09 23:04:26 +07:00
Gravit
9f5c2666b0
[FIX] Удалена функциональность прокси, хук pipeline 2019-08-09 22:51:46 +07:00
JoshO
58f8269c19 Update README.md (#312) 2019-08-03 02:18:07 +07:00
Egor Koleda
02b652ffd5 url fileserver fixes (#309) 2019-07-28 22:57:52 +07:00
zaxar163
0031200679 [FEATURE] Поддержка большего кол-ва версий. 2019-07-23 16:04:33 +03:00
Gravit
85c1985435
[FIX] Защита от дурака - проверки на null update* 2019-07-16 04:29:40 +07:00
Gravit
3c4b1a2543
[FIX] Новый вид authType - API 2019-07-16 04:08:25 +07:00
Gravit
189f63efc3
[FIX] Исправление сжатия JAR 2019-07-16 02:54:38 +07:00
Gravit
9da5191738
[FEATURE] CompressBuildTask сжатие JAR 2019-07-16 02:47:07 +07:00
Gravit
65d5608efd
[ANY] Исправление ошибок, найденных PVS-Studio 2019-07-16 02:30:09 +07:00
Gravit
e0113ac595 [FEATURE] SimpleEXELauncherBinary - альтернатива Launch4J 2019-07-12 20:43:56 +07:00
Gravit
3bf744debe [FEATURE] SimpleEXELauncherBinary 2019-07-12 20:33:25 +07:00
Gravit
12162de22f [FEATURE] CertificateManager функции с Reader/Writer 2019-07-12 20:11:55 +07:00
Gravit
6f77c5720f [FEATURE] CertificateManager стал полноценной частью API 2019-07-12 20:01:55 +07:00
Zaxar163
bbbe7a968c [FIX] Опечатка в тексте ошибки. 2019-07-12 19:11:48 +03:00
Zaxar163
442e612ca3 [FIX] Финальные фиксы после удаления Radon. 2019-07-12 19:10:07 +03:00
Zaxar163
8bb760ac01 [FIX] Фиксы скриптов Gradle. 2019-07-12 18:56:55 +03:00
Zaxar163
50af5fb2d8 [FEATURE] Начал удаление Radon`а. 2019-07-12 18:48:35 +03:00
Gravit
0abbb86e69
[FEATURE] Удаление лишнего неиспользуемого кода сашка 2019-07-12 06:10:59 +07:00
Gravit
1a8dd7c204
[FEATURE] Удаление лишнего неиспользуемого кода сашка 2019-07-12 06:10:31 +07:00
Gravit
484e3b69bd
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-07-11 01:50:55 +07:00
Gravit
5a889e0471
[FEATURE] Чтение сертификатов 2019-07-11 01:45:05 +07:00
Gravit
d008dc7217 [FIX] Исправлена роблема с reconnectCallback 2019-07-10 20:02:46 +07:00
Gravit
27b54cccba
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-07-06 20:26:58 +07:00
Gravit
96309ff0f8
Merge tag 'v5.0.5' into dev
Release 5.0.5 stable
2019-07-06 20:26:42 +07:00
Gravit
bfa466397a
Merge branch 'release/5.0.5' 2019-07-06 20:26:28 +07:00
Gravit
b67d1d5029
[ANY] 5.0.5b1 Stable 2019-07-06 20:26:16 +07:00
LoomeL
e3ec15b270 Настройка по умолчанию для featureStore (#304) 2019-07-06 20:06:00 +07:00
Gravit
e1f07cdfc8
[ANY] Обновление модулей 2019-07-06 19:56:26 +07:00
Gravit
198b7037d5
[FEATURE] Переработка Reconfigurable 2019-07-06 19:54:10 +07:00
Gravit
aac9aef821
[FEATURE] Help для субкомманд 2019-07-06 19:17:23 +07:00
Gravit
97bf5816c0
[FEATURE] Тест субкомманд в dumpSessions и dumpEntryCache 2019-07-06 18:55:50 +07:00
Gravit
5b7ae04fbd
[FEATURE] Субкомманды и автодополнение для них 2019-07-06 18:42:29 +07:00
Gravit
752fb9e879
[FEATURE] Автодополнение для параметров комманд 2019-07-06 18:03:04 +07:00
Gravit
fd9e2f9bd8
[FIX] Удалены Legacy параметры 2019-07-06 17:39:17 +07:00
Gravit
95d8cc461c
[FIX] Зеркало изменено на https://mirror.gravit.pro 2019-07-04 16:19:07 +07:00
Gravit
4b8a336ba0
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-07-04 14:42:38 +07:00
Gravit
623a8f189c
[FIX] DaoProvider не регистрировался 2019-07-04 14:41:30 +07:00
LoomeL
67662dfdac Добавление своей jvm в runtime (#302)
* Signed-off-by: LoomeL <kotgeorgy01@gmail.com>

* Загрузка своей JVM

* Поправка настройки по умолчанию
2019-07-03 20:31:34 +07:00
Zaxar163
493fbf8f2b [FIX] Добавил 1.14.3 2019-07-03 15:12:20 +03:00
Zaxar163
2c9a9631f5 [FIX] Добавил 1.14.1 и 1.14.2 2019-07-03 14:56:30 +03:00
Gravit
3bddccc2c1
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-07-03 14:23:44 +07:00
Gravit
6a5d110f9a
[FIX] Исправление ошибок сериализации 2019-07-03 14:23:26 +07:00
Zaxar163
73d1d6485b
[ANY] Ссылка на discord ведёт в канал #important. 2019-07-03 09:24:13 +03:00
Gravit
ea9084037c
[HOTFIX] Опечатка 2019-07-02 15:44:37 +07:00
Gravit
486fae8ccf
[FEATURE] Возможность отдавать нулевой HWID, а следовательно не использовать библиотеку OSHI если HWID не требуется 2019-07-02 15:36:50 +07:00
Gravit
c85350821e
[FEATURE] Эллиптическая криптография. Тестовые команды, исправление ошибок 2019-07-01 22:47:07 +07:00
Gravit
aebb96b32e
[FEATURE] Эллиптическая криптография. Создание CA, запись сертификатов на диск 2019-07-01 22:20:05 +07:00
Gravit
2e5295dbaf
[FEATURE] Эллиптическая криптография. Создание клиентских сертификатов 2019-07-01 21:45:11 +07:00
Gravit
c9f27a4f3c
[FEATURE] Криптобиблиотека bouncycastle 2019-07-01 20:24:54 +07:00
Gravit
09afc9943d
[FEATURE] Оптимизации Netty 2019-07-01 18:34:03 +07:00
Gravit
b39c640cd6
[REFRACTOR] Переименование интерфейсов WebSocket запросов/ответов на более понятные 2019-07-01 17:46:49 +07:00
Gravit
955020005a
[FIX] Удалён EventManager 2019-07-01 17:41:56 +07:00
Gravit
25ccda7ae2
[FIX] Исправление белых списков 2019-07-01 17:21:19 +07:00
Gravit
c6782d86a7
[FIX] Исправление ошибок в ClientsCommand 2019-07-01 17:13:59 +07:00
Gravit
37b679bbd6
[FIX] Исправление ошибок NPE при запуске 2019-07-01 17:08:20 +07:00
Gravit
6db16ac0f3
[FIX] Исправление ошибок компиляции 2019-07-01 17:01:05 +07:00
Gravit
d737b8f41d
[FEATURE][EXPERIMENTAL] WebSocketService стал доступным извне и привязан к глобальному GsonBuilder, команда clients 2019-07-01 16:59:47 +07:00
Gravit
c11f1660ca
[FIX] Фикс ошибки компиляции 2019-07-01 16:11:24 +07:00
Gravit
07dd7bcfc8
[FEATURE] RegLimiterComponent 2019-07-01 16:07:33 +07:00
Gravit
2d887c86a9
[FEATURE] Автоматическая регистрация при первом входе 2019-07-01 15:37:22 +07:00
Gravit
4bb5993ef0
[FIX] Инициализация DaoProvider 2019-07-01 15:31:50 +07:00
Gravit
c44208fed3
[FEATURE] Удален SessionFactoryManager 2019-07-01 15:28:13 +07:00
Gravit
8ef61b8673
[FEATURE] DaoProvider 2019-07-01 15:22:48 +07:00
Gravit
c8211ae7dd
[FEATURE][FIX] Проверка зарегистрирован ли уже пользователь 2019-07-01 15:04:28 +07:00
Gravit
5df618787f
[FEATURE] Регистрация в лаунчере 2019-07-01 14:54:33 +07:00
Gravit
494e714bb3
[FIX] Изменены пакеты классов websocket 2019-07-01 14:37:01 +07:00
Gravit
b408767343
[FIX] Поддержка пробелов в папках updates 2019-06-28 16:33:26 +07:00
Gravit
b93c7d33eb
[FIX] json расширение вместо conf/cfg 2019-06-28 16:27:05 +07:00
Gravit
e556bd70e8
[ANY] Update modules 2019-06-28 16:12:32 +07:00
Gravit
ddb4bc9728
[FIX] Удален legacyAddress/legacyPort 2019-06-28 16:08:29 +07:00
Gravit
96c2aac849
[FEATURE] Поддержка старого протокола перенесена в модуль SashokSupport 2019-06-28 15:59:42 +07:00
Gravit
94b2fb1424
[FIX] Фикс трансфера агента 2019-06-28 15:01:18 +07:00
Gravit
9922479314
[FEATURE] Обнаружение HTTP Error Code, частичная скачка ZIP 2019-06-28 14:59:46 +07:00
Gravit
ae34a06a5f
[FIX] IDEA Code Inspect 2019-06-28 14:36:58 +07:00
Gravit
2a56594534
[FIX] Испралвение авторизации с включенным ProGuard 2019-06-28 14:23:12 +07:00
Gravit
5192641e0b
Merge pull request #301 from radioegor146/patch-2
fix bad security check
2019-06-27 08:51:36 +07:00
Egor Koleda
155e3ff367
fix bad security check 2019-06-26 17:57:17 +03:00
Gravit
57359d18a8
Merge pull request #299 from radioegor146/patch-1
fix RequestAuthProvider
2019-06-20 06:03:10 +07:00
Egor Koleda
6e1750d25c
fix RequestAuthProvider
Рекомендую посадить на кол автора этого шедевра!
2019-06-20 00:55:18 +03:00
Gravit
a707dc4f3e
Merge pull request #294 from leshasmlesha/dev
[FIX] Исправил clear в std
2019-06-19 10:45:12 +07:00
Gravit
b5fae1a2b6
Merge pull request #297 from leshasmlesha/design_without_jfoenix
Design without jfoenix
2019-06-19 10:44:52 +07:00
Alex Dev Sm
2828a6df64 [FIX]Вернул галочки 2019-06-18 21:45:11 +03:00
Alex Dev Sm
8b0a530324 [FIX]Вернул кнопочкам прозрачность 2019-06-18 21:01:33 +03:00
Alex Dev Sm
bf28c66e2b [FEUTURE] Удаление jfoenix из зависимостей, и замена всех его функций на стандартные 2019-06-18 21:01:33 +03:00
Alex Dev Sm
3201be72cc [FIX] Исправил clear в std 2019-06-18 19:54:57 +03:00
Zaxar163
a9735e22ff
Merge pull request #296 from leshasmlesha/fix_gitlab
[FIX] убрал не нужный тест в gitlab
2019-06-18 19:33:07 +03:00
Alex Dev Sm
ae51eb3b6c [FIX] убрал не нужный тест в gitlab 2019-06-18 19:02:37 +03:00
Zaxar163
3d1d9ffdc9
Merge pull request #295 from leshasmlesha/fix_gitlab
Fix gitlab
2019-06-18 18:14:50 +03:00
Alex Dev Sm
d2b7a11456 [FIX] Снова снова и снова... фикс gitlab ci 2019-06-18 18:07:44 +03:00
Zaxar163
386f8d07bc
Merge pull request #292 from leshasmlesha/dev 2019-06-18 16:12:25 +03:00
Alex Dev Sm
2f345f78a8 [FIX] вроде должно теперь работать travis ci 2019-06-18 16:07:38 +03:00
Zaxar163
5ee7346744
Merge pull request #291 from leshasmlesha/dev
[FIX]Вторая попытка исправить CI
2019-06-18 16:01:02 +03:00
Alex Dev Sm
0048b00658 [FIX]Вторая попытка исправить CI 2019-06-18 15:57:41 +03:00
Alex Dev Sm
5231939302 [FIX] prev commit(забыл добавить ещё одно =) (#287) 2019-06-17 14:00:06 +03:00
Alex Dev Sm
92c4144697 [FIX]Исправил permissions в runtime (#286) 2019-06-17 13:07:37 +03:00
Zaxar163
ec220771ec [FIX][EXP] Фикс prev коммита. 2019-06-17 11:40:16 +03:00
Zaxar163
068e2c6d64 [FIX][EXP] Фикс встроенного файлсервера. 2019-06-16 16:08:26 +03:00
Zaxar163
80925b6366 [FIX] Попытка фикса gitlab CI. 2019-06-14 16:40:41 +03:00
Zaxar163
8e6f1334e2 [FIX] Запуск версий с vaargs в параметрах main метода 2019-06-14 13:44:51 +03:00
Zaxar163
bbc48ec239 [FIX] Модификатор final всё равно нужен в ByteArrayToBase64TypeAdapter. 2019-06-11 12:18:25 +03:00
Zaxar163
0b6f4e516b [FIX] Удалены костыли. 2019-06-11 12:14:52 +03:00
Zaxar163
d1132806da [FIX] NPE при запуске LaunchServer`а. 2019-06-11 12:04:22 +03:00
Zaxar163
408da409df [FIX] Забытая обработка исключений base64 в CommonHelper. 2019-06-11 11:58:21 +03:00
Zaxar163
af421c3e96 [FIX] Починка автообновления лаунчера. 2019-06-11 11:56:53 +03:00
Zaxar163
abc990bded [FIX] Агент на VM отличных от HotSpot. 2019-06-11 11:41:22 +03:00
Zaxar163
084b84a6a2 [HOTFIX] Фикс десереализации старых byte[]. 2019-06-11 10:41:10 +03:00
Gravit
d6b747ddc1
Merge tag 'v5.0.4' into dev
Release 5.0.4 Stable
2019-06-11 10:29:18 +07:00
Gravit
8f487cad40
Merge branch 'release/5.0.4' 2019-06-11 10:29:11 +07:00
Gravit
1a26682e66
[ANY] 5.0.4 2019-06-11 10:29:00 +07:00
Gravit
d69ab3c28c
[FIX] Исправлен StdProtectHandler 2019-06-11 10:27:36 +07:00
Gravit
53fe4a12f1
Merge tag 'v5.0.3b3' into dev
Release 5.0.3b3 stable
2019-06-10 11:25:46 +07:00
Gravit
4301947a1c
Merge branch 'release/5.0.3b3' 2019-06-10 11:25:37 +07:00
Gravit
6c178636c3
Release 5.0.3b3 Stable 2019-06-10 11:25:18 +07:00
Gravit
a56bd18e95
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-06-10 11:24:42 +07:00
Gravit
62785cd99e
Merge tag 'v5.0.3b2' into dev
Release 5.0.3b2 Stable
2019-06-10 11:24:20 +07:00
Gravit
9a48f1639c
Merge branch 'release/5.0.3b2' 2019-06-10 11:24:11 +07:00
Gravit
ecb6eb61ae
[ANY] 5.0.0b2 2019-06-10 11:23:54 +07:00
Gravit
88a941cf59 [FIX] Исправлена передача gsonBuilder 2019-06-07 18:51:01 +07:00
Gravit
bac39adf42
Merge tag 'v5.0.3' into dev
Stable 5.0.3
2019-06-07 13:17:27 +07:00
Gravit
1e2d3ba1bd
Merge branch 'release/5.0.3' 2019-06-07 13:17:14 +07:00
Gravit
4542ea9919
[ANY] Release 5.0.3 Stable 2019-06-07 13:16:51 +07:00
Gravit
cbfbc3c63b
[FEATURE] Расширенная имплементация UserHWID 2019-06-07 12:32:13 +07:00
Gravit
765d47deec
[FEATURE] Предварительная имплементация UserHWID 2019-06-07 06:36:32 +07:00
Gravit
91b7b2cd06
[FIX] Исправлена работа JsonConfigurable 2019-06-07 05:27:46 +07:00
Gravit
95f5ff13c3
[FEATURE][EXPERIMENTAL] StdProtectHandler 2019-06-07 05:23:33 +07:00
Gravit
7b348a1f0e
[FEATURE] Добавлен hibernate.sql 2019-06-07 05:07:18 +07:00
Gravit
57da09dee9
[FEATURE][FIX] Исправлена сериализация ClientPermissions и добавлен HibernatePermissionsHandler 2019-06-07 05:03:42 +07:00
Gravit
1f10bab874
Merge pull request #282 from GravitLauncher/nonInstance
[FEATURE] Удалено поле с статической инстанцией LaunchServer`а
2019-06-07 04:28:05 +07:00
zaxar163
483e052fff [FIX] SessionFactoryManager. Фикс дерегестрации хука AuthLimiterComponent. 2019-06-06 11:01:30 +03:00
Gravit
5eff6fae15
[FIX] Исправлен DownloadClientCommand 2019-06-06 11:03:16 +07:00
Zaxar163
11a23b4464 [FIX] Переписан код на try-with-resources в HibernateDAOImpl 2019-06-03 14:10:56 +03:00
Zaxar163
2dde0bb5e1 [FIX] Hibernate. 2019-06-03 13:56:54 +03:00
Zaxar163
05e98bcad6 Merge remote-tracking branch 'origin/feature/hibernate' into nonInstance 2019-06-03 13:12:10 +03:00
Zaxar163
49587a9ef8 [FIX] Фиксы после удаления инстанции LaunchServer. 2019-06-03 12:47:32 +03:00
Zaxar163
b21b6c2362 [FEATURE][EXP][NEEDS TEST] Отказ от статического поля инстанции в LaunchServer. 2019-06-03 11:50:28 +03:00
Zaxar163
a4d4aa834d [ANY] Organize imports. 2019-06-03 11:00:46 +03:00
Zaxar163
3bfb3881d2 [FIX] Сериализация в base64 запросов. 2019-06-03 10:56:00 +03:00
Gravit
248bead428
[FEATURE] Команда GetUserPassword меняющая пароль пользователя 2019-06-03 14:21:09 +07:00
Gravit
952279b1f4
[FEATURE] Команда GetAllUsers выводящая информацию о всех пользователях 2019-06-03 14:14:36 +07:00
Gravit
213e19763a
[FEATURE] Команда GetUser для просмотра информаици о пользователе 2019-06-03 14:09:36 +07:00
Gravit
e13c5580bc
[FEATURE] Обобщение UserDAO. Команда регистрации и стандартный UserDAO 2019-06-03 14:03:17 +07:00
Gravit
aced376e5e
[FEATURE] Обобщение UserDAO 2019-06-03 13:56:43 +07:00
Gravit
868f5295d2
[FEATURE] Реализация HibernateAuthHandler 2019-06-03 13:26:20 +07:00
Gravit
439b3f41c1
[FEATURE][CRITICAL] Добавление поддержки Hibernate 2019-06-03 12:46:04 +07:00
Gravit
03ef5265dd
Merge branch 'feature/renameall' into dev 2019-06-03 03:41:12 +07:00
Gravit
97ebc99b55
[ANY] Обновление модулей 2019-06-02 09:09:03 +07:00
Gravit
3d07b88adc
[ANY] Исправлегия конфигурации ProGuard, Gradle, патчей и прочих констант 2019-06-02 09:08:35 +07:00
Gravit
62fa95a5b3
[ANY] Великое переименование пакета ru.gravit в pro.gravit 2019-06-02 09:03:08 +07:00
Gravit
7b13f3c4bb
[FIX] Забытый HWIDHandler 2019-06-02 08:40:52 +07:00
Gravit
c8017ff01d
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-06-02 08:33:51 +07:00
Gravit
c896d2a196
[FIX] Исправлена проблема с дубляжом module-info.class/LICENSE.txt 2019-06-02 08:33:31 +07:00
Zaxar163
3b947e1987
Merge pull request #278 from yaroslav4167/patch-25
[FIX] Правка откидываний в опц. модах
2019-05-31 10:04:12 +03:00
zaxar163
a1652eaf38 [FEATURE][EXP] Правильное сереализация byte[] в GsonManager. 2019-05-31 10:02:56 +03:00
zaxar163
a0d6c5ad0e [FEATURE] Сериализатор byte[] в Base64 2019-05-31 09:54:07 +03:00
Yaroslavik
4cf828a948
[FIX] Правка откидываний в опц. модах
Жертвуя Tab-овским выбором чекбоксов. 
Если кто придумает более элегантное решение - переделайте ;D
2019-05-31 02:11:47 +02:00
Gravit
fe60d6b234
[FIX] Уменьшен размер лаунчера за счет использования только необходимых частей Netty 2019-05-31 05:51:02 +07:00
Gravit
592a6daa03
Merge tag 'v5.0.2' into dev
Release 5.0.2 Stable
2019-05-31 05:44:35 +07:00
Gravit
ba0572d4f6
Merge branch 'release/5.0.2' 2019-05-31 05:44:25 +07:00
Gravit
fdc9730e01
[ANY] Release 5.0.2 2019-05-31 05:44:14 +07:00
Gravit
27db641eae
[FIX] Исправлено форматирование при сохранении конфигурации 2019-05-31 05:42:51 +07:00
Gravit
4af4a002a7
[ANY] Update modules 2019-05-31 05:40:54 +07:00
Gravit
3ecc4c3bf1
[ANY] IDEA Reformat code 2019-05-31 05:40:19 +07:00
Gravit
bee6429bed
[FIX] Вернул на место options.update 2019-05-31 05:38:07 +07:00
Gravit
377a4c921f [FIX] Исправлена отправка исключений 2019-05-29 08:22:37 +07:00
Gravit
2176221c8e [FEATURE] Расширенный тип защиты 2019-05-29 08:15:32 +07:00
Gravit
8640a7c013
Merge pull request #276 from GravitLauncher/feature/design
Fix #275 bug, added featureStore in settings overlay, fix download ov…
2019-05-28 20:09:59 +07:00
DrLeonardo
5f7b0ca647 Fix #275 bug, added featureStore in settings overlay, fix download overlay 2019-05-27 23:57:02 +03:00
Gravit
ad46b99d58
Merge pull request #274 from GravitLauncher/feature/betterStructure
Feature/better structure
2019-05-26 21:42:05 +07:00
zaxar163
9af2a5b923 [FIX] Более правильное перемещение классов. 2019-05-26 10:08:04 +03:00
zaxar163
0b8769b898 [ANY] Переименован проект libLauncher -> LauncherCore 2019-05-26 09:37:25 +03:00
Gravit
30c34d4ce9 [FEATURE] Расширенные настройки Launch4J 2019-05-26 10:16:07 +07:00
Zaxar163
07ba774ed9 [FIX] Оверлей обновления. (#271)
* fix update overlay

* fix update overlay
2019-05-25 23:40:14 +07:00
zaxar163
bcb65726af Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-05-24 14:04:29 +03:00
zaxar163
1f692330a7 [ANY] Обновлены модули.
[FIX] Попытка пофиксить JarSigner_module.
2019-05-24 12:37:07 +03:00
Gravit
d0c59790bb
[FIX] Изменен механизм schedule ping запросов 2019-05-24 04:04:11 +07:00
Gravit
dadaa34926
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-05-24 03:31:19 +07:00
Gravit
aa1be6a23f
[FIX] Исправлена работа приема ping запросов у клиентской части вебсокетов 2019-05-24 03:29:03 +07:00
zaxar163
7a164dd1c7 [ANY] Обновлены модули.
[FIX] AdditionalHash_module.
2019-05-23 21:07:40 +03:00
Gravit
539e98bf5a
Merge tag 'v5.0.1' into dev
Stable 5.0.1
2019-05-23 06:14:18 +07:00
Gravit
e55200f5eb
Merge branch 'release/5.0.1' 2019-05-23 06:14:11 +07:00
Gravit
a437c31695
[ANY] 5.0.1 Stable 2019-05-23 06:14:00 +07:00
Gravit
e1eaad2cd0 [FIX] WebSocket ping 2019-05-22 23:10:51 +07:00
Gravit
3c5a83736b [FIX] Случайный откат версий субмодулей 2019-05-22 05:56:59 +07:00
Gravit
77e9fb3d31 [FIX] Остановка по Ctrl + C 2019-05-22 05:53:08 +07:00
Gravit
aab9a27f73 [FEATURE] Thread-Safe реализация WaitEventHandler 2019-05-22 05:41:58 +07:00
Gravit
65aec60ef5 [FEATURE] Сохранение ключа разблокировки консоли между запусками 2019-05-22 05:39:12 +07:00
Gravit
c5635de295 [FEATURE]Полноценная реализация блокировки launcher консоли 2019-05-22 05:32:40 +07:00
Gravit
5373856646 [FEATURE] MACAddr в MysqlHWIDHandler 2019-05-21 07:40:17 +07:00
Gravit
ac9ff4918a [FIX] Выключен старый костыль и включено использование флага 2019-05-21 04:16:50 +07:00
Gravit
1e77d6cc66 [FIX] Включен старый костыль 2019-05-21 03:56:01 +07:00
Gravit
7f6a83fb66 [FIX] Исправление ошибки при перезаписе файла 2019-05-21 03:49:08 +07:00
Gravit
227d0db778 [FIX] Исправлено удаление уже скопированных файлов 2019-05-21 03:32:37 +07:00
Gravit
204a341d14 [FIX] Исправлено удаление уже скопированных файлов 2019-05-21 03:24:44 +07:00
Gravit
d4739d17ed [FIX] Оптимизация производительности поиска модов в других клиентах 2019-05-21 03:05:08 +07:00
Gravit
877c26199d [FIX] Создание диреткорий 2019-05-21 02:26:41 +07:00
Gravit
b7dfa457ed [FIX] Поменял местами вход и выход 2019-05-21 02:18:27 +07:00
Gravit
6e1126a541 [FIX] Исправлен еще один баг с двойным resolve 2019-05-21 02:06:12 +07:00
Gravit
14a80ef67f [FIX] Исправлен баг с двойным resolve 2019-05-21 02:03:29 +07:00
Gravit
c4c50344fb [FIX] Заменил реализацию скачивания ZIP файла 2019-05-21 01:49:27 +07:00
Gravit
dc7e075789 [FIX] NPE в LauncherUpdateController 2019-05-21 01:41:41 +07:00
Gravit
6e02b80b50 [FIX] NPE в LauncherUpdateController 2019-05-21 01:33:35 +07:00
Gravit
3af66f6280 [FIX] Исправлена работа HashedDir.walk 2019-05-21 01:14:56 +07:00
Gravit
1b80f4f7aa [FIX] Логгирование места, куда загружатся обновления 2019-05-21 00:53:33 +07:00
Gravit
af5d99aa0b [FIX] Логгирование места, куда загружатся обновления 2019-05-20 23:39:45 +07:00
Gravit
4371369dba [FIX] getter для UpdateRequest.dir 2019-05-20 23:36:43 +07:00
Gravit
00b6e4400c [FIX][EXPERIMENTAL] Игнорирование исключний загрузки HashedStoreEntry 2019-05-20 07:09:39 +07:00
Gravit
69aef41e5d [FIX][EXPERIMENTAL] Исправление ошибки сохранения HashedStoreEntry 2019-05-20 07:07:43 +07:00
Gravit
c6389c697b [FEATURE][EXPERIMENTAL] Копирование модов из других клиентов 2019-05-20 06:20:06 +07:00
Gravit
a11764054c [FIX] Исправлена работа скачивания ZIP файла 2019-05-20 05:00:09 +07:00
Gravit
5e1fb46aec [FEATURE] Начальные команды управления GravitLauncherStorage 2019-05-20 04:55:57 +07:00
Gravit
17ede8b98f
Merge pull request #264 from GravitLauncher/feature/design
Update styles, fix blur effect, fix combobox styles, remove pressed o…
2019-05-20 02:31:16 +07:00
Dmitriy Leo
405caef0f4
Merge branch 'dev' into feature/design 2019-05-19 22:28:25 +03:00
Gravit
a409f19f66
[FEATURE] Опция включения AttachJarTask до ProGuard 2019-05-15 23:05:14 +07:00
DrLeonardo
3b8eb3d851 Update styles, fix blur effect, fix combobox styles, remove pressed options 2019-05-15 16:27:16 +03:00
Gravit
b985ae15a4
[FIX][EXPERIMENTAL] Скачивание zip архивом 2019-05-15 20:02:45 +07:00
Gravit
2e85180dc1
[FIX][EXPERIMENTAL] Скачивание zip архивом 2019-05-15 20:01:42 +07:00
Gravit
b98aba374a
[FEATURE][EXPERIMENTAL] Скачивание zip архивом 2019-05-15 19:58:28 +07:00
Gravit
46d3d11e15
[ANY] Сборка в GitLab CI библиотек 2019-05-15 18:47:17 +07:00
Gravit
85e0a2e1f8
Merge tag 'v5.0.0b7' into dev
5.0.0b7 Stable
2019-05-15 18:23:52 +07:00
Gravit
cd13b7f5b5
Merge branch 'release/5.0.0b7' 2019-05-15 18:23:40 +07:00
Gravit
b6f01ca0fe
[ANY] 5.0.0b7 stable 2019-05-15 18:22:46 +07:00
Gravit
85a4cca5e5
[ANY] Обновление модулей 2019-05-15 18:21:08 +07:00
Gravit
3a9ec5db61
[ANY] IDEA Reformat 2019-05-15 18:11:22 +07:00
Gravit
3521f5882d
[ANY] IDEA Code Inspect 2019-05-15 18:09:32 +07:00
Gravit
846ec90575
[ANY] IDEA Code Cleanup 2019-05-15 18:00:02 +07:00
Gravit
ebceab5501
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-05-15 17:32:10 +07:00
Gravit
89477e52c6
[FIX] Исправлена проблема при завершении Ctrl + C 2019-05-15 17:31:53 +07:00
Gravit
77c8607d20
Merge pull request #260 from Yshmeel/dev
Добавил блюр на задний фон, сделал выбор по умолчанию в ComboBox типа авторизации
2019-05-15 00:02:53 +07:00
Ruslan Yusupov
9bd5280818 Добавил блюр на задний фон, сделал выбор по умолчанию в ComboBox типа авторизации 2019-05-14 16:52:58 +00:00
Gravit
96d07a4b25
[FIX] Fix GitLab CI 2019-05-14 19:35:55 +07:00
Gravit
6113a187c6
[FIX] Fix Gitlab CI 2019-05-14 19:33:49 +07:00
Gravit
efcecb31a8
[ANY] GitLab CI 2019-05-14 19:11:55 +07:00
Gravit
63a637eef5 [FIX] Лимит на WebSocket сообщение увеличен в 10 раз 2019-05-14 16:00:41 +07:00
Gravit
dbffcd0030 [FIX] Фикс завершения LaunchServer по Ctrl + C 2019-05-14 15:58:13 +07:00
Gravit
f0d5afb677
Merge pull request #259 from Yshmeel/dev
Доработал ComboBox с выбором типа авторизации
2019-05-13 00:09:53 +07:00
Ruslan Yusupov
6e1f4cd495 Доработал ComboBox с выбором типа авторизации 2019-05-12 17:05:01 +00:00
Gravit
cf9f4ebef9
[FEATURE] Добавление auth в NewLauncherSettings 2019-05-11 17:28:31 +07:00
Gravit
de19457a5a
Merge pull request #255 from GravitLauncher/feature/design
Update debug, console, settings and mainmenu scenes
2019-05-11 17:18:02 +07:00
DrLeonardo
a8f8073f8c Update debug, console, settings and mainmenu scenes 2019-05-11 13:00:38 +03:00
Gravit
31ac1895af
[FEATURE] Автокомплит 2019-05-11 16:50:17 +07:00
Gravit
179733a987
[FIX] Исправление работы JLine 2019-05-11 16:35:32 +07:00
Gravit
21434b4ed6
[ANY] Обновление библиотек 2019-05-11 16:30:17 +07:00
Gravit
4e27eca7fa
Merge pull request #254 from GravitLauncher/feature/design
Update design for updating overlay, minor fix in css file
2019-05-10 15:36:27 +07:00
DrLeonardo
cbe673140b Update design for updating overlay, minor fix in css file 2019-05-09 21:34:08 +03:00
Gravit
94b5a07fc9
[FIX] Вернулись назад NettyIpForwardHandler 2019-05-09 22:21:24 +07:00
Gravit
236b433d5f
[FIX] Еще один вариант реализации NettyIpForwardHandler 2019-05-09 22:01:54 +07:00
Gravit
c8e9918cd9
[FIX] Исправление записи сообщения NettyIpForwardHandler 3 2019-05-09 21:46:59 +07:00
Gravit
66f0a8b9d1
[FIX] Исправление записи сообщения NettyIpForwardHandler 2 2019-05-09 21:35:38 +07:00
Gravit
8fe01853a2
[FIX] Исправление записи сообщения NettyIpForwardHandler 2019-05-09 21:34:44 +07:00
Gravit
0e3a5619f9
[FIX] Исправление записи сообщения NettyIpForwardHandler 2019-05-09 21:25:35 +07:00
Gravit
09cae122d1
[FIX] Исправление порядка NettyIpForwardHandler 2019-05-09 21:16:55 +07:00
Gravit
77566cbd30
[FIX] Возможный фикс ipForwarding 2019-05-09 21:11:15 +07:00
Gravit
798a5ddc7e
[FIX] Вывод отладочного сообщения если класс сообщения ipForward указан неверно 2019-05-09 21:03:59 +07:00
Gravit
fe57424e2a
[FEATURE] IP Forwarding 2019-05-09 20:05:53 +07:00
Gravit
a66d7a7164
[FEATURE} IP Forwarding 2019-05-09 20:00:10 +07:00
Gravit
bb04ed849c
[FIX] Вывод сообщения об ошибке в jsonRequest 2019-05-09 19:42:07 +07:00
Gravit
4ab3c3a9f4
Merge tag 'v5.0.0b6' into dev
Beta 5.0.0 build 6
2019-05-08 14:37:00 +07:00
Gravit
4004d2f53c
Merge branch 'release/5.0.0b6' 2019-05-08 14:36:50 +07:00
Gravit
4a3a03173a
[ANY] 5.0.0b8 BETA 2019-05-08 14:36:33 +07:00
Gravit
8d8beb1569
[FIX] Обкат библиотеки OSHI 2019-05-08 00:53:20 +07:00
Gravit
8873d6ec90
[FIX] Еще немного магии с портами 2019-05-07 23:52:04 +07:00
Gravit
686ffa6371
[FIX] Возможный фикс проблемы с web socket secure 2019-05-07 23:35:36 +07:00
Zaxar163
f2e68c9f62 [FEATURE] Дизайн, продолжение. (#250)
* Update design, add class for RAMslider & checkbox, fixes

* [FIX] Регрессия в dialog.js

* [FIX] Строки без смысла.
2019-05-07 18:49:51 +07:00
Andrei Gavrilov
b594947399 Update Gradle (#249) 2019-05-07 18:49:38 +07:00
Gravit
d33909af1f [FIX] Смена логгирования с DEBUG на DEV при подключении клиента 2019-05-07 18:48:09 +07:00
Gravit
9e82dabf40 [FIX] Исправлена работа launcher.guardType 2019-05-07 18:06:50 +07:00
Zaxar163
2f55ae5dd8
[ANY] Обновил OSHI 2019-05-05 09:37:36 +03:00
Zaxar163
807517f038 [FIX] Права интерфейсов в JarHelper. 2019-05-04 17:35:40 +03:00
Zaxar163
67f1dcf5f9 [FIX] Передача ClientProfile в ServerPinger. 2019-05-04 13:04:35 +03:00
Gravit
07607ec1ef
Merge tag 'v5.0.0b5' into dev
Beta 5.0.0 build 5
2019-05-04 16:15:40 +07:00
Gravit
7904b0db31
Merge branch 'release/5.0.0b5' 2019-05-04 16:15:25 +07:00
Gravit
77ac4b9462
[ANY] 5.0.0b5 2019-05-04 16:14:39 +07:00
Gravit
07dbc2ba04
[FIX] Исправлена возможная проблема с AutoSaveSessions 2019-05-04 16:13:10 +07:00
Gravit
ea202eee5b
[FEATURE] Управление лаунчсервером из лаунчера 2019-05-04 15:23:43 +07:00
Gravit
0e9d8b4ca7
[FIX] Поставил noJAnsi в аргументы старта клиента 2019-05-04 14:06:22 +07:00
Gravit
f2e38a150b
[FIX] Фикс уровня логгирования dev 2019-05-04 14:03:44 +07:00
Gravit
ac3b3bf10c
[ANY] Обновление модулей 2019-05-04 14:00:22 +07:00
Gravit
80c515ea98
[FIX][ Фикс модуля ScriptEngine и других мелких багов 2019-05-04 13:59:42 +07:00
Zaxar163
986b3194ec [ANY] Рефакторинг. 2019-05-03 23:10:35 +03:00
Zaxar163
1e02f5b2f9 [ANY] Bump netty to new version. 2019-05-03 23:06:04 +03:00
Gravit
6a70a23556
[FIX][EXPERIMENTAL] Фикс возможных проблем с requestUUID 2019-05-03 23:38:20 +07:00
Gravit
fcacd4fe12
[FIX][EXPERIMENTAL] Фикс возможных проблем 2019-05-03 23:33:23 +07:00
Gravit
08f811add2
[FEATURE][EXPERIMENTAL] Экспериментальная связка авторизации для прокси 2019-05-03 23:16:00 +07:00
Gravit
f1cd39babd
[FEATURE][EXPERIMENTAL] LaunchServer в качестве прокси 2019-05-03 23:07:37 +07:00
Gravit
dd596805e1
[FEATURE] Хуки авторизации 2019-05-03 21:34:10 +07:00
Gravit
6ec3211450
[FEATURE] BiHookSet 2019-05-03 21:14:03 +07:00
Gravit
886524bb94
[ANY] Перемещение всего лишнего из libLauncher в LauncherAPI 2019-05-03 21:06:22 +07:00
Gravit
cbc2506a13
[ANY] перемещение всех events в LauncherAPI 2019-05-03 20:50:10 +07:00
Gravit
b807dd871a
[FEATURE] Возможность отправлять сообщения всем клиентам 2019-05-03 20:49:00 +07:00
Gravit
47e33b0588
[ANY] LaunchServer знает о Request методах 2019-05-03 20:37:37 +07:00
Gravit
b8cc9ec9f5
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-05-03 20:35:28 +07:00
Gravit
7ac537fa40
[ANY] Выделение Request методов отдельно от AuthLib 2019-05-03 20:35:14 +07:00
Gravit
9b622e8391
[FEATURE] Переименование LauncherPAI -> LauncherAuthlib 2019-05-03 20:27:48 +07:00
Gravit
32e8065f4c
[FEATURE] Поддержка множества WebSocket соеденений 2019-05-03 20:22:15 +07:00
Zaxar163
9a35344a14 [ANY] Небольшая оптимизация градла. 2019-05-03 14:59:32 +03:00
Zaxar163
dd6b906b8b [ANY] Обновлены модули 2019-05-03 14:00:01 +03:00
Zaxar163
b5014175d0 Revert "[FIX] Удалил неиспользуемый параметр из ServerWrapper."
This reverts commit 03a70c1d73.
2019-05-03 12:23:04 +03:00
Zaxar163
0e126482ef Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-05-03 11:46:39 +03:00
Zaxar163
ffe738f323 [ANY] 5.0.0b4 beta 2019-05-03 11:26:57 +03:00
Zaxar163
c2072332de
Merge pull request #240 from TheXaver/patch-3
[FIX] Работоспособность get_it.sh
2019-05-03 11:12:24 +03:00
Zaxar163
ab98a09f85 [FEATURE] Ещё защита от банального ClassNotFound... 2019-05-03 11:09:33 +03:00
Zaxar163
66e8f29c19 [FEATURE] Исправление прав на ОС с поддержкой POSIX. 2019-05-03 10:57:28 +03:00
Zaxar163
889748712a [ANY] Удалил EchoRequest. 2019-05-03 10:36:42 +03:00
Zaxar163
03a70c1d73 [FIX] Удалил неиспользуемый параметр из ServerWrapper. 2019-05-03 10:21:22 +03:00
Zaxar163
f49d007f9f [FIX] Radon работает. Агент тоже работает. 2019-05-03 10:06:11 +03:00
Andrei Gavrilov
e1a4ccd5f9
Update get_it.sh 2019-05-02 22:58:47 +03:00
zaxar163
4615624431
[FIX] Ещё 1 бажек AttachJarsTask. 2019-04-30 16:17:32 +03:00
zaxar163
2e9e8f8bb3
[FIX] Duplicate entry c httpclient. 2019-04-30 16:10:11 +03:00
Gravit
18a79ebe60
[FIX] Исправлена проблема с httpclient 2019-04-29 19:58:52 +07:00
Gravit
da4b89bbd0
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-04-29 19:46:36 +07:00
Gravit
6f802f3a76
[FIX] Временно отключен ASM трансформации LauncherAgent из за проблем с LinuxDisplay 2019-04-29 19:45:36 +07:00
zaxar163
5fad2f0281
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-04-29 12:49:46 +03:00
zaxar163
0970b68760
[FIX] Include в ServerWrapper/build.gradle. 2019-04-29 12:47:11 +03:00
Gravit
ee03597184
Merge tag 'v5.0.0b3' into dev
Beta 5.0.0 build 3
2019-04-29 16:16:55 +07:00
Gravit
5e0bcf5154
Merge branch 'release/5.0.0b3' 2019-04-29 16:16:40 +07:00
Gravit
adb8091ff3
[ANY] 5.0.0b3 beta 2019-04-29 16:16:33 +07:00
Gravit
f820271418
[FIX] Radon выключен по умолчанию 2019-04-29 16:08:43 +07:00
Gravit
02c8ee4999
[FIX] Возможность выбора уровня логгирования Netty 2019-04-29 15:59:30 +07:00
Gravit
72ce4234a3
[FIX] Исправлен возможный NPE в AuthResponse 2019-04-29 15:56:19 +07:00
Gravit
43c44446d9
Merge branch 'feature/netty-client' into dev 2019-04-29 15:52:20 +07:00
Gravit
edc5f1f7b2
[FIX] Исправлена гонка потоков, исправлен reconnect loop, пофикшен вывод ошибок 2019-04-29 15:35:51 +07:00
zaxar163
a921fde598
[FIX] Запаковка netty в ServerWrapper. 2019-04-29 09:56:39 +03:00
Gravit
323cfe763a
[FEATURE][EXPERIMENTAL] onOpen реализован 2019-04-29 13:38:35 +07:00
Gravit
1cc08204e5
[FEATURE][EXPERIMENTAL] Исправлена работа Netty на клиенте 2019-04-29 11:00:37 +07:00
Gravit
9480e94778
[FEATURE][EXPERIMENTAL] Netty в качестве библиотеки вебсокетов 2019-04-29 10:19:47 +07:00
Zaxar163
91d2690761 [FIX] Эксперементальный фикс бага с отсутствием реконнекта. (#238) 2019-04-29 08:30:56 +07:00
zaxar163
e172cb194a
[FIX] Ещё одна описка в конфиге, которую не замечали с 4.5. 2019-04-28 15:20:51 +03:00
Zaxar163
aa3a5b447a
[FIX][CRITICAL] Описка в дефолтном конфигурационном файле. 2019-04-28 15:15:12 +03:00
Zaxar163
c6c86afce1 [FEATURE] Опция отключения файл-сервера + автокопирование binaries (тоже опция). (#236)
* [FIX] Убраны лишние классы из libLauncher.

* [FIX] Получение RAM.

* [FIX] Ещё фиксы такового с RAM.

* [REFACTOR] Удалён лишний код.

* [FEATURE] Теперь прикрутить sentry можно просто добавив библиотеку в libraries и дописав 3 строчки в runtime.

* [FIX] Ошибка в паттернах ServerWrapper, порождает java.util.IllegalFormatConversionException

* [FEATURE] Чистка конфига.

* [FIX] Убрал лишние варнинги.

* [FIX] Мои ошибки.
2019-04-28 19:06:12 +07:00
Zaxar163
10a441b2ae [ANY] Небольшой рефакторинг. (#233)
* [FIX] Убрал свою криворукость.

* [ANY] Небольшой рефакторинг.

* [ANY] Обновил readme,
2019-04-28 18:49:17 +07:00
Zaxar163
8ba8d27241 [FIX] Инициализация поля с authOptions. (#235) 2019-04-28 18:48:45 +07:00
Gravit
57e334efc8
[FIX] Фикс setup ServerWrapper'а 2019-04-28 12:44:23 +07:00
Zaxar163
c4cd9812e0 [FIX] Ошибка в паттернах ServerWrapper; баги получения RAM. (#232)
* [FIX] Убраны лишние классы из libLauncher.

* [FIX] Получение RAM.

* [FIX] Ещё фиксы такового с RAM.

* [REFACTOR] Удалён лишний код.

* [FEATURE] Теперь прикрутить sentry можно просто добавив библиотеку в libraries и дописав 3 строчки в runtime.

* [FIX] Ошибка в паттернах ServerWrapper, порождает java.util.IllegalFormatConversionException
2019-04-28 12:07:01 +07:00
Gravit
175df1796c
[FIX][CRITICAL] Фикс java.util.IllegalFormatConversionException: d != java.lang.String в ServerWrapper 2019-04-28 11:39:43 +07:00
Gravit
446acf2181
[FIX] Закоментирован фикс verifyHDir 2019-04-27 20:58:33 +07:00
Gravit
b3079b83dc
[FIX] Создание директорий UpdateRequest'ом 2019-04-27 20:55:29 +07:00
Gravit
24a453f338
[FIX] Дополнительное логгирование в verifyHDir 2019-04-27 20:27:22 +07:00
Gravit
b1fe3cf2a9
[FIX] Забытая проверка в verifyHDir 2019-04-27 19:56:55 +07:00
Gravit
63183873a5
[FIX] Опечатка в ClientProfile 2019-04-27 19:51:29 +07:00
Gravit
76661305af
[FIX] Не реагируем если изменились только директории 2019-04-27 19:44:48 +07:00
Zaxar163
05539133cb
[FEATURE] Поддержка 1.14 2019-04-27 15:24:20 +03:00
Gravit
a26311be88
[FEATURE] Отладочный вывод verifyHDir 2019-04-27 19:20:26 +07:00
Gravit
4597ea64e9
Merge tag 'v5.0.0' into dev
Beta 5.0.0b2
2019-04-27 17:33:42 +07:00
Gravit
36e1fd45f5
Merge branch 'release/5.0.0' 2019-04-27 17:33:15 +07:00
Gravit
4aaf6bb206
[ANY] 5.0.0b2 BETA 2019-04-27 17:33:06 +07:00
Gravit
2fcfaef058
[FIX] Фикс NPE при установки через скрипт 2019-04-27 17:22:45 +07:00
Gravit
701878bcf4
[FEATURE] Возможность дерегистрации Reconfigurable/Reloadable 2019-04-27 17:17:10 +07:00
Gravit
bb27559314
[FEATURE] Изменения названий функций ProviderMap 2019-04-27 17:05:49 +07:00
Gravit
18bfe77c60
Update design (#231) 2019-04-27 16:43:52 +07:00
Zaxar163
806887d56e
Merge pull request #230 from GravitLauncher/any/refactor-php 2019-04-26 07:03:51 +02:00
Gravit
27c4224030
[FIX] Исправление UrlEncode символа / 2019-04-26 08:08:51 +07:00
Gravit
d7351ce474
[FIX] Фиксы работы с ProGuard 2019-04-24 17:06:48 +07:00
Gravit
a49e523d5d
[FEATURE] Стандартные команды 2019-04-24 16:18:34 +07:00
Gravit
02613ceef4
[FEATURE] Блокировка консоли лаунчера 2019-04-24 15:49:01 +07:00
Gravit
b432f8f13f
[FEATURE] launcher Console 2019-04-24 14:48:09 +07:00
Gravit
76691da8c9
[FEATURE] Параметр isPreset 2019-04-24 13:32:22 +07:00
Gravit
f32844aa15
[FEATURE] Именнованный провайдеры и HookSet 2019-04-24 13:08:22 +07:00
Gravit
dbdf3f3c89
[FIX] Убран отладочный вывод в debug.js 2019-04-24 12:56:33 +07:00
Gravit
7704e46996
[FEATURE] Ограничение числа символов в отладочном окне 2019-04-24 12:51:55 +07:00
Gravit
cd490a0868
[FIX] Обновление дизайна 2019-04-24 12:13:45 +07:00
Zaxar163
6e86af1037
[ANY] Пустой кусок кода в скрипте привязки к ASFramework. 2019-04-24 06:39:30 +02:00
Gravit
50873253b0
[FIX] Исправлена ошибка некорректного завершения работы 2019-04-23 11:42:09 +07:00
zaxar163
3a69e622ec
[ANY] Рефакторинг. 2019-04-21 16:01:16 +03:00
zaxar163
b325609a59
[FIX] Бажек в gradle скриптах. 2019-04-21 14:58:25 +03:00
Gravit
21d698deb3 [FEATURE] Гибкая настройка URL скачивания клиента 2019-04-21 04:56:56 +07:00
Gravit
4d6a456b8f [FEATURE] Runtime может задавать свои параметры конфигурации 2019-04-21 04:50:41 +07:00
Gravit
b0baf1e1f6 [FIX] Фикс найденных багов 2019-04-20 05:58:59 +07:00
Gravit
c3fd501ef1 [ANY] Обновлены модули 2019-04-20 05:18:55 +07:00
Gravit
caaccadd83 [ANY] Optimize imports 2019-04-20 05:14:02 +07:00
Gravit
d266fe8b74 [FIX] Фиксы автозамены 2019-04-20 05:09:47 +07:00
Gravit
b12c26047b [FEATURE] GsonManager 2019-04-20 05:03:06 +07:00
Gravit
019d864130 [FEATURE] Универсальный адаптер заменил собой шаблонный код 2019-04-20 04:29:05 +07:00
Gravit
2ef2d95fb9 [FEATURE] Универсальный адаптер и ProviderMap 2019-04-20 04:14:56 +07:00
Gravit
b55e6f1f40 [FEATURE] Вывод человекочитаемой ошибки при исключении в Response 2019-04-20 03:51:27 +07:00
Gravit
4de0891dcc [FEATURE] Поддержка requestUUID на стороне клиента 2019-04-20 03:31:56 +07:00
Gravit
58858a0290 [FEATURE] Поддержка requestUUID ля определения к какому запросу принадлежит ответ 2019-04-20 03:23:54 +07:00
Gravit
3a160659d4 [ANY] Модули 2019-04-20 02:47:10 +07:00
Gravit
b5cdb0c244 [FEATURE] Возможность использовать в runtime планировщик задач 2019-04-20 02:27:26 +07:00
Gravit
514e8e3535 [FEATURE] Асинхронное поделючение к серверу 2019-04-20 02:16:31 +07:00
Gravit
c2f8ee7bab [FEATURE] Переработка системы Request'ов, использование Future 2019-04-20 01:42:38 +07:00
Zaxar163
4027ec3b91 [FEATURE] Жёсткий краш вместо выхода. (#222)
* [FEATURE] Жёсткий краш вместо выхода.

* [ANY] Обновлены модули.

* [FIX] Пустой лог ошибок.
2019-04-17 06:46:54 +07:00
Zaxar163
2bee616d1c
[FIX] Лишний код в travis.yml. (#224) 2019-04-15 22:26:37 +03:00
Gravit
1ad67d4a75
[FEATURE] GetAvailabilityAuth 2019-04-14 00:55:01 +07:00
Gravit
477798e30c
[FIX] Расширение логики HashedDirStore 2019-04-14 00:18:30 +07:00
Gravit
c700ec2791
[FIX] Расширение логики HashedDir Store 2019-04-13 23:59:41 +07:00
Gravit
da739b3eb6
[FIX] HashedDir Store 2019-04-13 23:51:28 +07:00
Gravit
264bd514f5
[FIX] Забытый адаптер hashedEntry 2019-04-13 23:21:14 +07:00
Gravit
f7091bf074
[FIX] Фиксы настроек и LogHelper 2019-04-13 23:13:35 +07:00
Gravit
ae0e178d43
[FEATURE] Экспериментальная фитча - натсройки в json 2019-04-13 22:31:22 +07:00
Gravit
0283110a92
[FIX] verifyToken 2019-04-13 21:29:12 +07:00
Gravit
5e7230de21
[FIX] Замена велосипеда на urlEncode 2019-04-13 21:05:41 +07:00
zaxar163
da615fb11b
[FEATURE] Пересмотр логики AttachJarsTask. 2019-04-13 15:49:24 +03:00
zaxar163
ef89b3ce6e
[FIX] JFoenix нельзя обфусцировать. 2019-04-13 15:27:26 +03:00
zaxar163
29e98917a9
[FIX] Множество NoClassDefFound... 2019-04-13 15:25:23 +03:00
zaxar163
f3a19701a2
[FIX] LauncherAgent. 2019-04-13 14:56:11 +03:00
Gravit
d7a58ef42e
[FEATURE] Динамическая генерация маппингов для ScriptEngine 2019-04-13 10:01:52 +07:00
Gravit
43aebf9f84
[FEATURE] Динамическая генерация маппингов для ScriptEngine 2019-04-13 10:01:21 +07:00
Gravit
5178cc4b6a
[FEATURE] Методы работы с Jar(JarHelper) 2019-04-13 09:03:55 +07:00
Gravit
3f7cbbb004
[FIX] Фикс отображения HTML логов 2019-04-13 08:13:46 +07:00
Gravit
bd44a55f6b
[FIX] Фикс HelpCommand 2019-04-13 07:44:29 +07:00
Gravit
9bdde2a727
[FEATURE] Реализация вывода логов в HTML 2019-04-13 07:40:05 +07:00
Gravit
31b9d43a7f
[FEATURE] Восстановлена работа LaunchServerConsole 2019-04-13 07:09:19 +07:00
Gravit
7869618d51
[FEATURE] Полностью распределены команды по категориям, команда help доступна из libLauncher 2019-04-13 06:48:24 +07:00
Gravit
1f716f0307
[FEATURE] Разукрашеный help 2019-04-13 06:27:48 +07:00
Gravit
da1fed63bd
[FEATURE] Возможность прямого управления цветами JAnsi с помощью функций LogHelper.raw* 2019-04-13 06:06:20 +07:00
Gravit
5612776da0
[FEATURE] Разбитие команд лаунчсервера на категории 2019-04-13 05:51:27 +07:00
Gravit
8192cc50d8
[FEATURE] Описание категорий комманд 2019-04-13 05:33:35 +07:00
Gravit
6d03a3bcaf
[FEATURE] Категории комманд 2019-04-13 05:26:39 +07:00
Gravit
c3fa410964
[FIX] Человекочитаемая ошибка UpdateResponse и org.apache.commons.logging в конфиге ProGuard 2019-04-13 04:42:04 +07:00
Gravit
02c59cc457
[FIX] Вызов replaceClassess закоментирован 2019-04-13 04:32:23 +07:00
Gravit
9ba6c6a134
[FIX] Фикс вызова SetProfileRequest 2019-04-13 03:58:23 +07:00
Gravit
a2a1e72a78
[FIX] Фиксы api.js, скриптов сборки gradle и генерации конфига 2019-04-13 03:51:15 +07:00
Gravit
81ae4c35f0
Merge branch 'feature/design' into dev 2019-04-13 03:30:56 +07:00
Zaxar163
75e781d08e Пофиксил ASM. Требуется тест! (#216)
* [FIX] ASM bundling.

* Revert "[FIX] Agent работает."

This reverts commit 76a9c07a48.

* Revert "[FIX] Удалена sm часть LauncherAgent"

This reverts commit 54c7526a66.

* [FIX] Закрываем ресурсы в LauncherAgent.

* [FIX] Не загруженный java.awt.Robot.

* [FIX] getRAM работает на OpenJDK 11+

* [FIX] Жуткий RequestAuthHandler.

* [FIX] Грамматика английского языка в RequestAuthHandler.

* [ANY] Опять RequestAuthHandler ошибки в грамматике.
2019-04-13 03:22:24 +07:00
sasha0552
2180bd989e Request AuthHandler (#218)
[FEATURE] RequestAuthHandler и php скрипт к нему
2019-04-12 07:01:17 +07:00
Gravit
0201c8d474 [FEATURE] Указание guardType 2019-04-12 05:15:05 +07:00
Gravit
3c0de3727d [FEATURE] LaunchServerRuntimeConfig 2019-04-12 04:58:45 +07:00
Gravit
ab57e7d2d7 [FEATURE] JsonAuthHandler 2019-04-12 04:11:33 +07:00
DrLeonardo
d0be72bf55 Update 2019-04-10 21:22:02 +03:00
DrLeonardo
cf89635471 Update 2019-04-08 17:06:07 +03:00
Gravit
cfe6c6c2ac [FIX] автометическое копирование jfoenix в launcher-libraries 2019-04-07 21:09:41 +07:00
Gravit
a540bdcf48 [FIX] Фикс бага с ошибкой при восстановлении сессии 2019-04-07 16:55:52 +07:00
Gravit
54c7526a66 [FIX] Удалена sm часть LauncherAgent 2019-04-07 15:33:57 +07:00
Zaxar163
76a9c07a48
[FIX] Agent работает. 2019-04-07 11:26:35 +03:00
Zaxar163
b7673cf134
[FIX] OW2 asm. 2019-04-07 11:20:40 +03:00
Gravit
8e87f55cff
Feature/design (#214)
* Update design

* Update design
2019-04-07 15:10:19 +07:00
Zaxar163
0094c3b613 [FEATURE] LauncherAgent переделан. (#213)
* [REFACTOR] Рефакторинг.

* [FEATURE] LauncherAgent переделан.

* [FIX] Подача нужных агенту аргументов.

* [FEATURE] Вы можете поставить листы ClientProfile модулем.

* [FIX] Скрипты gradle, для работы LauncherTest.

* [FEATURE] Система тестов - начало.

* [FIX] Perms handler для тестовю
2019-04-07 14:53:39 +07:00
DrLeonardo
6d69efe258 Update design 2019-04-06 21:42:11 +03:00
Дмитрий Лео
e26d95b93d Update design 2019-04-06 17:21:38 +03:00
Gravit
f747ef55d1
Merge pull request #212 from GravitLauncher/feature/design
update design
2019-04-06 19:05:10 +07:00
Дмитрий Лео
7f3102f292 update design 2019-04-06 14:55:31 +03:00
Gravit
bb611d2022 [FEATURE] Опции производительности Netty 2019-04-06 18:41:38 +07:00
Gravit
1d4d9ae170 [FIX] GetHWIDCommand 2019-04-06 17:51:53 +07:00
Gravit
467138ec2c [FIX] Поддержка Ping/pong WebSockets 2019-04-06 14:02:06 +07:00
Gravit
94138252c1 [FIX] Фикс java.lang.NoSuchFieldException: SERVER 2019-04-06 13:44:53 +07:00
Gravit
314e955ca3
[ANY][MODULES] Обновлены модули 2019-04-04 20:19:48 +07:00
Gravit
2590ee7533
[FIX] Фикс runtime части 2019-04-04 19:22:06 +07:00
Gravit
fefafc30c1
[REFRACTOR] Привидение в порядок структуры пакетов LaunchServer 2019-04-04 19:10:28 +07:00
Gravit
902936ddd7
[REFRACTOR] Чистка LauncherConfig от кода старого протокола 2019-04-04 19:02:12 +07:00
Gravit
c1903428eb
[REFRACTOR] Чистка Request от кода старого протокола 2019-04-04 18:56:34 +07:00
Gravit
dbb07dee79
[REFRACTOR] Удалены все запросы и большинство ответов по протоколу сашка 2019-04-04 18:40:24 +07:00
Gravit
d805fb7515
[FEATURE] Реализована полоска загрузки при использовании WebSockets 2019-04-04 17:48:34 +07:00
Gravit
e008c33aff
[ANY] 5.0.0 dev 2019-04-04 17:19:49 +07:00
Gravit
0b0a99966b
[FEATURE] Восстановление WebSockets соеденения при разрыве 2019-04-04 15:59:41 +07:00
Gravit
30645741f4
[FEATURE] Реализована ServerWrapper часть вебсокетов 2019-04-04 15:16:23 +07:00
Gravit
27ab69cd78
[FEATURE] Реализация profileByUUID/profileByUsername на вебсокетах 2019-04-04 14:02:42 +07:00
Gravit
ae3e824c91
[FEATURE] Реализация restoreSession 2019-04-04 13:50:04 +07:00
Gravit
a0e2c28d81
[FEATURE][MODULES] MojangTextureProvider 2019-04-04 00:38:59 +07:00
Gravit
8466894d49
[FIX] Закрытие соеденения при выходе 2019-04-03 23:49:50 +07:00
Gravit
40d4003696
[FIX] Фикс ProGuard для Request'ов 2019-04-03 23:39:33 +07:00
Gravit
7b695e77ad
[FIX] Фикс LauncherRequest 2019-04-03 23:20:38 +07:00
Gravit
558ad30e24
[FIX] Фикс некоторых RequestEvent 2019-04-03 23:02:01 +07:00
Gravit
04cdfcb360
[FIX] Фикс LauncherRequest 2019-04-03 22:59:56 +07:00
Gravit
468ff01f9f
[FIX] Фикс JoinServerRequest 2019-04-03 22:37:05 +07:00
Gravit
a9bba37df7
[FIX] Фикс ListDownloader 2019-04-03 22:21:11 +07:00
Gravit
08f7a98dbb
[FIX] Фикс UpdateRequest, алгоритм обхода HashedDir, реализация joinServerRequest/CheckServerRequest 2019-04-03 22:13:40 +07:00
Gravit
50adbac117
[FIX] UpdateRequest реализован 2019-04-03 21:14:23 +07:00
Gravit
85eb2d205b
[FIX] Фикс консоли 2019-04-03 20:42:14 +07:00
Gravit
1da05c49bd
[FEATURE] Простейшая релаизация UpdateRequest 2019-04-03 20:40:19 +07:00
Gravit
221666df3e
[FEATURE] Топорная реализация скачивания 2019-04-03 20:37:31 +07:00
Gravit
bda1c3658b
[ANY] IDEA Reformat code 2019-04-03 20:27:40 +07:00
Gravit
f1ccfbf58e
[FEATURE] ServerWrapper расширяет JsonConfigurable 2019-04-03 17:37:29 +07:00
Gravit
a636fbe336
[FEATURE] ConfigManager 2019-04-03 17:09:53 +07:00
Gravit
e9f36fa44f
[FEATURE] GetPermissions/GivePermissions command 2019-04-03 16:21:53 +07:00
Gravit
5c88b8eb14
[FEATURE] ClientPermissions сериализуется в Long 2019-04-03 15:51:41 +07:00
Gravit
d6ef1fd99d
[FEATURE] ServerWrapperSetup 2019-04-03 15:46:18 +07:00
Gravit
1a3bf0b055
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-04-03 14:05:53 +07:00
Gravit
a04801fa17
Merge pull request #204 from GravitLauncher/feature/tests
[FEATURE] Струтрука gradle проекта для тестов.
2019-04-01 10:05:42 +07:00
Gravit
9f6fe314d2
Merge pull request #203 from TheXaver/patch-1
Update get_it.sh
2019-03-31 10:49:18 +07:00
Andrei Gavrilov
6751ffb4a4
Update get_it.sh 2019-03-31 03:08:02 +03:00
Zaxar163
f1e6830a72 [FEATURE] Струтрука gradle проекта для тестов. 2019-03-30 12:37:45 +03:00
Zaxar163
6b663c481c Merge branch 'dev' of github.com:GravitLauncher/Launcher into
dev
2019-03-29 13:19:17 +03:00
Zaxar163
6a934ec2ae [FIX] Лишняя библиотека в launcher-libraries. 2019-03-29 13:18:34 +03:00
Gravit
1ed588e1c0
[FEATURE] CommandRemover 2019-03-28 17:26:47 +07:00
Gravit
24aefd47f1
[FEATURE] MemoryHWIDHandler/JsonFileHWIDHandler 2019-03-28 17:13:27 +07:00
Zaxar163
695758aa18 [FIX] Влезаем в лаунчер через agent. (#202)
* [FIX] Правки градла.

* [FEATURE] Скрипт для скачивания.

* [DOCS] Правки readme.

* [FIX][DOCS] Удален неактуальная папка docs.

* [DOCS] Готов readme.

* [FIX] Launcher sign.

* [FEATURE] Модули по новому.

* [FIX] Способ влезть в лаунчер через agent.

* [ANY] Обновлены модули (там фикс JarSigner).

* [FEATURE] ListDownloader.
2019-03-28 15:54:18 +07:00
Gravit
0194ab7a5b
[FEATURE] Модуль ServerScriptEngine 2019-03-28 12:39:22 +07:00
Gravit
fee94ff368
[FEATURE] Команды, Reload/Reconfigurable не зависят от регистра 2019-03-28 12:07:54 +07:00
Gravit
3d82253308
[ANY] 4.5.1 dev 2019-03-28 11:21:51 +07:00
Gravit
7fdc6e0b05
Merge tag 'v4.5.0' into dev
Release 4.5.0
2019-03-28 11:20:44 +07:00
Gravit
c69460d802
Merge branch 'release/4.5.0' 2019-03-28 11:20:07 +07:00
Gravit
46f584076d
[ANY] 4.5.0 2019-03-28 10:58:21 +07:00
Gravit
65d47295bc
[FIX] Фикс работы WriteParamsThread 2019-03-28 10:43:27 +07:00
Gravit
24987bac6c [FIX] Работа врапперов без токена 2019-03-26 15:03:06 +07:00
Gravit
826a6c7567 [FIX] Таймаут соеденения в 30 секунд 2019-03-25 04:35:32 +07:00
Gravit
c9bcfcc8e0
Merge pull request #198 from GravitLauncher/fix/launch4j
[FIX] Скачка launch4j.
2019-03-25 04:18:10 +07:00
Gravit
97e3327b89 [FIX] Исправлена возможная проблема с запуском лаунчера при смене режима отладки между запусками 2019-03-25 04:17:25 +07:00
Gravit
376fa1b76e [FIX] Изменена логика ожидания запуска с выключенной отладкой 2019-03-24 15:52:50 +07:00
Gravit
28d592aa70 [ANY] Обновлены модули 2019-03-24 03:41:48 +07:00
Gravit
a8db9c8aeb [FIX] Фикс порядка вызова missArchJava 2019-03-24 03:39:32 +07:00
zaxar163
b36a623e69
[ANY] Небольшой рефакторинг (Organize imports). 2019-03-23 10:44:22 +03:00
zaxar163
c75addd930
[FIX] Скачка launch4j. 2019-03-23 09:14:45 +03:00
Gravit
4fe0bf4195
[FEATURE] Поддержка указания кастомной магии лаунчера сашка 2019-03-23 11:30:47 +07:00
Gravit
255dd6bd56
[FIX] Ошибка в getModulusCommand 2019-03-23 11:03:40 +07:00
Gravit
4dd5b3a6b1
[FEATURE] ComponentCommand 2019-03-23 11:02:45 +07:00
Gravit
75f69a3234
[FIX] Увеличен таймаут сессий до 3 часов 2019-03-23 10:40:05 +07:00
Gravit
0c5227b5ab
[FIX] Хуки авторизации распространяются и на серверную авторизацию 2019-03-23 10:34:46 +07:00
Gravit
9145243b8c
[FIX] Фикс java.lang.IllegalArgumentException: jdk.internal.ref.PhantomCleanable<?> declares multiple JSON fields named next 2019-03-23 10:30:05 +07:00
Gravit
bc87e65ec9 [FIX] Ошибки merge 2019-03-22 13:19:58 +07:00
Gravit
c562f48384
Вернуть коммиты на место (#197)
* [FIX] Фикс отправки json запросов к mojang

* [FEATURE] [CRITICAL] AuthProviderPair

* [FIX] Фикс автогенерации конфига

* [FIX] брана проверка имени в Reload и Reconfigurable менеджерах

* [FEATURE] textureProvider внесен в AuthProviderPair

* [FIX] Реализация Request части и фикс ServerWrapper

* [ANY] Обновление модулей
2019-03-22 13:14:29 +07:00
Gravit
b34042b8e1
Merge branch 'dev' into master 2019-03-22 13:13:15 +07:00
Gravit
8def68fa90
Merge pull request #191 from GravitLauncher/radon
Radon
2019-03-22 13:04:24 +07:00
Gravit
4ea62e5e22 [ANY] Обновление модулей 2019-03-22 12:50:40 +07:00
Gravit
0ce407f1c3 [FIX] Реализация Request части и фикс ServerWrapper 2019-03-22 11:40:49 +07:00
Gravit
5f252682f3 [FEATURE] textureProvider внесен в AuthProviderPair 2019-03-22 11:36:06 +07:00
Gravit
421fa07317 [FIX] брана проверка имени в Reload и Reconfigurable менеджерах 2019-03-22 11:10:40 +07:00
Gravit
8329823f7a [FIX] Фикс автогенерации конфига 2019-03-22 11:08:21 +07:00
Gravit
c9c867d8f3 [FEATURE] [CRITICAL] AuthProviderPair 2019-03-22 11:04:42 +07:00
Gravit
a9cc2841ac [FIX] Фикс отправки json запросов к mojang 2019-03-22 09:55:30 +07:00
zaxar163
64942b9852
[FIX] Опечатки в ProGuardBuildTask. 2019-03-16 14:47:50 +03:00
zaxar163
f522f5014c
[FIX] Radon успешно обфусцирует лаунчер. 2019-03-16 14:34:29 +03:00
zaxar163
bacf51b443
[FIX] Исправил автосгенерированный конфиг. 2019-03-15 21:54:31 +03:00
Gravit
3a6e6f32d8
[FIX] Фикс NPE в AuthLimiter 2019-03-16 01:47:47 +07:00
Gravit
0268a48fe6
[FIX] Закрытие соеденений после запроса 2019-03-16 00:59:17 +07:00
zaxar163
8ed337d709
[FIX] Возможность отключить Radon. 2019-03-15 20:55:34 +03:00
zaxar163
f20816b9a2
[FIX] Финальные правки конфига. 2019-03-15 20:13:49 +03:00
zaxar163
4e26d85fe5
[FIX] Скрипты gradle. 2019-03-15 20:07:50 +03:00
zaxar163
39cbfb0e33
[FIX] Рабочий радон. 2019-03-15 20:04:26 +03:00
zaxar163
9122a700e0
[FIX] ClassPath для Radon и Proguard. 2019-03-15 17:40:48 +03:00
zaxar163
62af331966
[FIX] Gradle scripts. 2019-03-15 17:34:49 +03:00
zaxar163
f739cff28c
[FIX] Радон готов. 2019-03-15 17:32:01 +03:00
zaxar163
e94908d08f [ANY] Обновлён Radon. 2019-03-15 17:19:21 +03:00
zaxar163
7107b6e593
[FIX] Удалены остатки Avanguard. 2019-03-15 16:59:23 +03:00
zaxar163
2b8a7f4946 Merge remote-tracking branch 'origin/dev' into radon 2019-03-15 16:54:37 +03:00
Zaxar163
8bea8f3ce9 [ANY] Обновлён Radon. PR готов. 2019-03-14 22:01:32 +03:00
Gravit
dc2a978716
[FEATURE] Запись protectToken d параметры wrapper'а 2019-03-14 23:56:43 +07:00
Gravit
37be6b86c3
[FEATURE] ProtectHandler 2019-03-14 23:54:08 +07:00
zaxar163
3dfdb88e99
[FIX] Дефолтный конфиг Radon... 2019-03-14 15:40:32 +03:00
Gravit
7e5fafa159
[FIX] Исправлена ошибка с отваливающимся соеденением по таймауту во время хеширования 2019-03-14 02:26:20 +07:00
zaxar163
e37bda8962
[FEATURE] Radon работает. Требуется тест. 2019-03-13 22:13:39 +03:00
zaxar163
a2784aaa45
[FEATURE] RadonBuildTask. TODO: Integrate it and create default config. 2019-03-13 21:46:08 +03:00
zaxar163
e0eb90ec37
[FIX] Правки gradle скриптов. 2019-03-13 21:02:41 +03:00
zaxar163
d0d5eb69d7
[FEATURE] Начал пилить Radon. 2019-03-13 20:34:24 +03:00
Gravit
3f887ef619
[FIX] Удален параметр updatesNotify и добавлено время ожидания к ClientLauncher.launch 2019-03-14 00:06:28 +07:00
Gravit
64f865fa47
[FIX] Удален Updater и исправлены ошибки в компонентах 2019-03-13 17:09:27 +07:00
Gravit
694c994807
[FEATURE] AuthLimiter теперь компонент 2019-03-13 16:49:28 +07:00
Gravit
3eabd1e38e
[FEATURE] Компоненты добавлены в конфигурацию 2019-03-13 16:24:28 +07:00
Gravit
e95557c6fd
[FEATURE] Компоненты 2019-03-13 16:13:21 +07:00
Gravit
f4c2c6e3a6
Merge tag 'v4.4.2' into dev
Release 4.4.2
2019-03-13 15:59:45 +07:00
Gravit
c658a85c35
Merge branch 'release/4.4.2' 2019-03-13 15:59:33 +07:00
Gravit
c0acdd04c4
[ANY] 4.4.2 2019-03-13 15:59:22 +07:00
Gravit
d2963e8b40
[FIX] Немного правок из репозитория Сашка 2019-03-13 15:52:50 +07:00
Gravit
5ad5795a62
[FIX] Исправлена проблема с NPE при HWID compareMode 2019-03-12 17:38:22 +07:00
Gravit
b16cd0cc67
[FIX] Отключен лог DirWatcher 2019-03-12 17:31:19 +07:00
Gravit
1cc727239d
[FEATURE] Алгоритм генерации словаря ProGuard на основе projectName 2019-03-12 16:23:36 +07:00
Gravit
367993daf0
[FEATURE] Удален неиспользуемый и неактуальный код: launchLocal и address_override 2019-03-12 15:32:14 +07:00
Gravit
88be2a623b
[FEATURE] Включена фитча customDir 2019-03-12 15:24:48 +07:00
Gravit
f157e9c01f
[FEATURE] HikariCP выключен по умолчанию 2019-03-12 15:08:51 +07:00
Gravit
96254b11ea
[FEATURE] clientData доступен всем Response по умолчанию 2019-03-12 15:05:41 +07:00
Gravit
124f1ddbeb
[FEATURE] Дополнительная информация по сетевым интерфейсам в HWID 2019-03-11 17:43:55 +07:00
Gravit
24b8227685
[FEATURE] Перезагрузка конфига LaunchServer'а без его рестарта 2019-03-10 19:28:22 +07:00
Gravit
6c59b86779
Merge tag 'v4.4.1' into dev
Stable 4.4.1
2019-03-10 19:07:32 +07:00
Gravit
9940202d64
Merge branch 'release/4.4.1' 2019-03-10 19:07:18 +07:00
Gravit
c13f1db02d
[AN] 4.4.1 2019-03-10 19:07:02 +07:00
Gravit
962137cc48
Merge pull request #188 from GravitLauncher/feature/downloader-auto
[FEATURE] Готов Downloader.
2019-03-10 19:05:22 +07:00
Gravit
84e5f91fdf
[FIX] Дополнительные проверки для более понятной ошибки 2019-03-10 19:02:36 +07:00
Gravit
be4c2f4b07
[FIX] Assess denied и witch 2019-03-10 18:48:46 +07:00
Gravit
94d677fe1e
[FIX] Некорректная инициализация клиенских модулей 2019-03-10 16:17:19 +07:00
Gravit
08696839dc
[FEATURE] Подкручены числа HWID 2019-03-09 22:53:30 +07:00
Gravit
07761dd88b
[FEATURE] Новые параметры в HWID 2019-03-09 22:41:12 +07:00
Gravit
5786699474
[FIX] compareMode дополнительный отладочный вывод 2019-03-09 21:40:50 +07:00
Gravit
af90fd41ca
[FIX] compareMode обернут 2019-03-09 21:20:08 +07:00
Gravit
d5c7e5ed68
[FIX] Фикс скрипта установщика 2 2019-03-09 16:42:17 +07:00
Gravit
2c0a202080
[FIX] Фикс скрипта установщика 2019-03-09 16:18:14 +07:00
zaxar163
d06fcafdc7 [FEATURE] Готов Downloader. 2019-03-08 16:39:27 +03:00
Zaxar163
1819e1c95c [FEATURE] Получение launch4j. (#187)
* [FEATURE] Получение launch4j.

* [FEATURE] Генерация готового bundle, со всей структурой каталогов нужной для работы лауннчсервера.

* [FIX] Название архива с LaunchServer.
2019-03-08 20:21:41 +07:00
Gravit
57231d948d
[FEATURE] LaunchServerConsole 2019-03-08 19:43:37 +07:00
Gravit
ec5ef7af4f
[REFRACTOR] Преобразование CommandHandler 2019-03-08 18:58:18 +07:00
Gravit
7f61f21a0b
[FEATURE] compareMode в HWIDHandler 2019-03-08 18:15:01 +07:00
Gravit
920a15a6b2
[FEATURE] Сравнение HWID 2019-03-08 18:02:54 +07:00
zaxar163
6033703b9b [ANY] Обновлены модули. 2019-03-08 13:17:05 +03:00
zaxar163
65dbab4581
[ANY] Обновлены модули. 2019-03-08 13:13:16 +03:00
Gravit
f5d732ea7e
Merge tag 'v4.4.0' into dev
Stable 4.4.0
2019-03-08 16:48:53 +07:00
Gravit
7050e0e9ac
Merge branch 'release/4.4.0' 2019-03-08 16:48:45 +07:00
Gravit
87cbfdd130
[ANY] 4.4.0 2019-03-08 16:48:29 +07:00
Zaxar163
7c3c2e8aaa [FIX] Лишние проекты в Gradle. (#186)
* [FIX] Теперь в проектах без исходного кода не появляются файлы gradle и
idea.

* [FIX] Правильное название rootProject.

* [ANY] Обновлены модули.
2019-03-08 16:20:35 +07:00
Gravit
9bc798108b [FIX] Вернул кусок кода 2019-03-04 16:54:36 +07:00
Gravit
693996a968 [FIX] optMod.visible работала некорректно 2019-03-03 21:32:55 +07:00
Gravit
009aa2e6ab [FIX] Windows must die version 2 2019-03-03 19:38:36 +07:00
Gravit
b9e8f48065 [FIX] Windows must die 2019-03-03 19:26:14 +07:00
Gravit
579761bcbd Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-03-03 18:16:03 +07:00
Gravit
72d2f1d995 [ANY] Изменен формат вывола логов DirWatcher ля отладки 2019-03-03 18:14:22 +07:00
Zaxar163
38bf8cc3fa [ANY] Обновлены модули. 2019-03-03 13:37:14 +03:00
Gravit
c62a3865dd [FEATURE] GetModulusCommand 2019-03-03 16:41:47 +07:00
Gravit
73fc66da0f [FIX] Вернул проверки для unmarkOptional 2019-03-03 16:35:43 +07:00
Yaroslavik
c25e5a77aa [FIX] Правка логики работы дерева опциональных модов (#184)
При перезаходе в лаунчер и отключении основной опциональной модификации (от которой зависят другие) - эти же другие не отключались, что приводило к различным конфликтам.
2019-03-01 16:01:18 +03:00
Gravit
df39276c2a
[FIX] Избыточные проверки в unmarkOptional 2019-02-28 16:26:45 +07:00
Gravit
2300584501
Merge pull request #183 from GravitLauncher/refactor
[ANY] Выполнено organize imports.
2019-02-27 12:04:04 +07:00
Gravit
bda1913ca0 [FIX] Используем String,join для FileNameMatcher 2019-02-27 08:34:29 +07:00
zaxar163
89e493aa6a
[ANY] Выполнено organize imports. 2019-02-25 12:11:01 +03:00
Gravit
0495c26546
Merge pull request #182 from GravitLauncher/updModules
[ANY] Обновлены модули.
2019-02-25 15:50:17 +07:00
zaxar163
0723c8533a
[ANY] Обновлены модули. 2019-02-25 11:06:24 +03:00
Gravit
0819dabc69
[FIX] Issue #179 2019-02-24 20:59:26 +07:00
Gravit
616aa951bc
[FIX] Issue #179 2019-02-24 19:45:47 +07:00
Gravit
637652c1c6
[FIX] Исправлена проблема с settings.bin 2019-02-23 18:12:49 +07:00
Gravit
b9aeacc38b
[FIX] Исправлен URL netty.address 2019-02-20 18:55:16 +07:00
Gravit
fc21e854d3
[FIX] Поднят settingsMagic 2019-02-20 18:51:22 +07:00
Gravit
67b88bc593
[FIX] verifyHDir после старта WatchService 2019-02-20 18:50:54 +07:00
Gravit
5d77b9c53a
[FIX] Фикс ClientLauncher.main 2019-02-20 18:44:30 +07:00
Gravit
66f773a8ce
[FIX] Фикс launchClient 2019-02-20 18:30:14 +07:00
Gravit
a738f75667
[FIX] Фикс doLaunchClient 2019-02-20 18:24:26 +07:00
Gravit
dd27978e12
[FEATURE] Конфигурирование netty при автосоздании конфига 2019-02-20 17:35:04 +07:00
Gravit
709efdd04e
[FEATURE] nettyEnabled/nettyAddress 2019-02-20 17:25:04 +07:00
Gravit
2fa638d3c6
[FEATURE] nettyAddress 2019-02-20 17:20:00 +07:00
Gravit
57fc3b1c04
[FIX] Исправление рантайма для UpdateResponse 2019-02-20 17:13:17 +07:00
Gravit
bcedb95eec
[FEATURE] UpdateResponse 2019-02-20 16:55:21 +07:00
Gravit
e0c6386d23
[FEATURE] netty.clientEnabled 2019-02-17 19:13:36 +07:00
Gravit
833c322812
Merge tag 'v4.3.3b2' into dev
Hotfix 4.3.3b2
2019-02-17 18:49:14 +07:00
Gravit
d18f0ee80a
Merge branch 'hotfix/4.3.3b2' 2019-02-17 18:49:01 +07:00
Gravit
ecae747b64
[ANY] 4.3.3b2 2019-02-17 18:48:48 +07:00
Gravit
88b72a13f3
[HOTFIX] Исправлен ExecCommand 2019-02-17 18:48:26 +07:00
Gravit
caab7908dd
Merge tag 'v4.3.3' into dev
Release 4.3.3
2019-02-17 18:42:50 +07:00
Gravit
2e1aa5918a
Merge branch 'release/4.3.3' 2019-02-17 18:42:36 +07:00
Gravit
9239a95f20
[ANY] 4.3.3 2019-02-17 18:42:30 +07:00
Gravit
cffaed6de8
[FIX] Фикс двойных логов 2019-02-17 18:37:52 +07:00
Gravit
64b1e9cff0
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-02-17 18:28:02 +07:00
Gravit
517ffbd371
[FEATURE] getJVMTotalMemory 2019-02-17 18:27:44 +07:00
Gravit
44a4feacde
[FEATURE] LauncherGuard задает битность JVM 2019-02-17 18:19:54 +07:00
Zaxar163
757c7690cb [ANY] Обновлены модули (#174)
* [FIX] MojangAuthProvider и его URL.

* [FIX] Вправлены JFX классы, лишние убраны, т. к. теперь можно легко доставить JFoenix или аналоги.

* [FIX] BinaryFileAuthHandler теперь работает.

* [FIX] BinaryFileAuthHandler вынесен в LegacySupport.

* [FEATURE] Переход на ThreadPool.

* [ANY] Обновлены модули.

* [FIX] Ошибки merge.
2019-02-17 18:15:57 +07:00
Gravit
ca0e8c0299
[FEATURE] Изменена система выводов логгирования 2019-02-17 18:14:19 +07:00
Gravit
ef1f7b0e76
[FIX] Фиксы AddLogListener/ExecCommand/Auth 2019-02-17 15:30:03 +07:00
Gravit
b3d007c6d1
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-02-17 14:24:52 +07:00
Gravit
0fcb3fd5e4
[FEATURE] AddLogListener 2019-02-17 14:24:20 +07:00
Gravit
ef3544f268
Merge pull request #173 from GravitLauncher/threadPool
Thread pool
2019-02-15 00:08:45 +07:00
zaxar163
90b91a9635 [FEATURE] Переход на ThreadPool. 2019-02-14 14:03:50 +03:00
zaxar163
7c5c4faa75
[FIX] BinaryFileAuthHandler вынесен в LegacySupport. 2019-02-14 13:45:36 +03:00
zaxar163
feca582da0
[FIX] BinaryFileAuthHandler теперь работает. 2019-02-14 13:28:23 +03:00
Gravit
7b0f973a9a
Merge pull request #171 from GravitLauncher/fixFX
[FIX] Вправлены JFX классы.
2019-02-13 17:54:10 +07:00
zaxar163
23e732e8b2 [FIX] Вправлены JFX классы, лишние убраны, т. к. теперь можно легко доставить JFoenix или аналоги. 2019-02-13 12:43:17 +03:00
Gravit
dd586f23eb
[FEATURE] Скрипт привязки под IPS
By https://github.com/DarkShyMW/Launcher
2019-02-10 23:35:39 +07:00
Gravit
acf8370c54
[FEATURE] BufferedInputStream/BufferedOutputStream
By PullRequest https://github.com/new-sashok724/Launcher/pull/72
2019-02-10 23:27:31 +07:00
Gravit
ec7e64fdf4
[FEATURE] Портирован UpdateListRequest 2019-02-10 18:44:25 +07:00
Gravit
b5d2f47cf8
[FEATURE] Портирован SetProfileRequest 2019-02-10 18:20:52 +07:00
Gravit
956cef2cd6
[FEATURE] Реализована обработка ошибок в WebSockets 2019-02-10 17:54:19 +07:00
Gravit
982a6f0342
[FIX] Забыток условие в LauncherRequest 2019-02-10 17:20:10 +07:00
Gravit
f750e8897a
[FIX] Попытка реализации автообновления с вебсокетами 2019-02-10 17:18:37 +07:00
Gravit
a83754e7f1
[FIX] Проверка на доступность websockets в Request 2019-02-10 17:01:19 +07:00
Gravit
be32df3e1e
[FEATURE] Портирование ProfilesRequest 2019-02-10 17:00:05 +07:00
Gravit
98354345a0
[FEATURE] Портирование AuthRequest/LauncherRequest 2019-02-10 16:48:44 +07:00
Gravit
40fe55a46d
[FIX] getType to getLegacyType 2019-02-10 15:55:27 +07:00
Gravit
c1711d39d3
[FIX] Request поддерживает возможность перехода на WebSockets 2019-02-10 15:51:20 +07:00
Gravit
7f062e720a
[FIX] @LauncherNetworkAPI 2019-02-10 15:44:09 +07:00
Gravit
746fdc36e4
[FIX] Унификация Results 2019-02-10 15:38:48 +07:00
Gravit
5b22989e57
[FIX] WebSockets зарегистрировал RequestEvent 2019-02-10 15:15:25 +07:00
Gravit
4c7e3a8d44
[FIX] Полностью рабочий WebSocket client 2019-02-10 15:09:29 +07:00
Gravit
b4d184baae
Merge tag 'v4.3.2' into dev
Release 4.3.2
2019-02-10 14:06:31 +07:00
Gravit
109b3f0423
Merge branch 'release/4.3.2' 2019-02-10 14:06:15 +07:00
Gravit
943154374a
[ANY] Release 4.3.2 2019-02-10 14:06:00 +07:00
Gravit
4bb49799af
Merge pull request #168 from GravitLauncher/feature/wClient
[FEATURE] WebSocket клиент.
2019-02-10 14:00:23 +07:00
Gravit
5b0da238e2
[ANY] OSHI обновлен до 1.13 2019-02-10 13:58:08 +07:00
Gravit
52c470b487 [FIX] Фикс NPE при использовании врапперов 2019-02-07 08:24:51 +07:00
Gravit
d278641add [FIX] Фикс ошибки компиляции AuthResponse 2019-02-07 08:16:25 +07:00
Gravit
7024c1325c [FIX] Фикс NPE при использовании врапперов 2019-02-07 08:11:59 +07:00
Gravit
f9129c28d2
[FEATURE] AuthProvider preAuth 2019-02-07 14:46:25 +07:00
Gravit
4c6360b8af
[FEATURE] Новые параметры в GuardLicense 2019-02-06 16:21:17 +07:00
Gravit
2c8f3d4f5b
[FEATURE] GuardLicense 2 2019-02-06 16:00:18 +07:00
Gravit
d7a2d0733f
[FEATURE] GuardLicense 2019-02-06 15:46:58 +07:00
Gravit
5dc07290eb
[FEATURE] ClientLauncherContext 2019-02-06 15:35:55 +07:00
zaxar163
4f1bd3712e
[FEATURE] WebSocket клиент. 2019-02-05 21:25:41 +03:00
Gravit
aad6ea7833
Merge tag 'v4.3.1' into dev
Stable release 4.3.1
2019-02-05 19:36:54 +07:00
Gravit
aac9856e53
Merge branch 'release/4.3.1' 2019-02-05 19:36:32 +07:00
Gravit
ca52798855
[ANY] 4.3.1 2019-02-05 19:36:20 +07:00
Gravit
662b76b09c
[FIX] Указание аргументов для сервера 2019-02-05 19:30:56 +07:00
Gravit
795bca03a3
[FEATURE] Указание аргументов для сервера 2019-02-05 18:33:53 +07:00
Gravit
64cf9788d9
[FEATURE] checkInstallCommand и MultiCommand 2019-02-04 14:20:28 +07:00
Gravit
7f9ca582d6
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-02-03 21:16:52 +07:00
Gravit
d3343518f1
[FIX] Copy-paste в SetProfileResponse 2019-02-03 21:13:37 +07:00
zaxar163
bcd1c9018a
[FIX] SetProfileResponse сравнение строки и Client. 2019-02-03 17:10:08 +03:00
Zaxar163
8d979b3175 Исправил скрипты сборки и пофиксил некоторые части Updater. (#164)
* [FIX] Вынес Timer в LaunchServer и Updater, ведь модули тоже могут его использовать.

* [FIX] Updater исправлен парсинг типа версии и номера сборки.
2019-02-03 18:15:30 +07:00
Gravit
a3e3089032
[FIX] Возможность добавлять библиотеки с дополнительными файлами в META-INF 2019-02-03 18:13:08 +07:00
Gravit
9ca5158eeb
[FEATURE] Доработка LauncherConfig для работы с nettyPort 2019-01-29 23:15:17 +07:00
Gravit
0e215899e4
[FEATURE] Автозапуск netty сервера при его настройке 2019-01-29 22:42:31 +07:00
Gravit
e2c7b455d2
[FEATURE] Настройка Netty 2019-01-29 22:38:23 +07:00
Gravit
748b9ac4e7
Merge branch 'feature/netty-protocol' into dev 2019-01-29 22:32:27 +07:00
Gravit
9adf69932c
[FIX] Фикс синхронизации в LegacyRequestBridge 2019-01-29 22:31:41 +07:00
Gravit
0d804a0558
[FEATURE] Мост для старых Request 2019-01-28 23:29:54 +07:00
Gravit
dd4f97313e
[FEATURE] Использование type вместо requesttype 2019-01-28 23:21:24 +07:00
Gravit
8726988291
[FEATURE] Реализация ResultInterface классами RequestEvent 2019-01-28 23:14:13 +07:00
Gravit
92cb0b0628
[FEATURE] Клиент метод на основе notifyAll 2019-01-28 23:08:51 +07:00
Gravit
2e4acb721a
[FEATURE] Оснащение всех Event UUID'ами 2019-01-28 22:35:49 +07:00
Gravit
1ce4b6f11b
[FEATURE] Перенос RequestEvent 2019-01-28 22:28:12 +07:00
Gravit
751048ab3e
[FEATURE] Портирован SetProfileResponse 2019-01-28 21:44:38 +07:00
Gravit
52609413a2
[FEATURE] Портированы запросы профилей 2019-01-28 21:39:50 +07:00
Gravit
a6686029a5
[FIX] Фикс привилений при авторизации 2019-01-28 21:16:11 +07:00
Gravit
43de166d22
[FIX] Фикс авторизации сервера 2 2019-01-28 21:08:06 +07:00
Gravit
2937d70866
[FIX] Фикс авторизации сервера и проверки лаунчера 2019-01-28 20:56:20 +07:00
Gravit
9ea4c051d5
[FEATURE] Add ProfilesResponse WebSockets 2019-01-28 20:33:39 +07:00
Gravit
01d6587c11
[FIX] Фикс авторизации и CheckServer в WebSockets 2019-01-28 20:25:49 +07:00
Gravit
09802d418e
Merge tag 'vv4.3.0' into dev
Release 4.3.0
2019-01-28 20:03:28 +07:00
Gravit
e85b674f38
Merge branch 'release/v4.3.0' 2019-01-28 20:01:02 +07:00
Gravit
6ebc731382
[FIX] Версия 4.3.0 2019-01-28 20:00:49 +07:00
Gravit
003289dc71
[FIX] Смена settingsMagic 2019-01-28 19:59:01 +07:00
Gravit
103b72981f [FIX] Фикс поиска exe при isDownloadJava 2019-01-24 21:34:32 +07:00
Gravit
ff569cc2ec
Merge pull request #161 from GravitLauncher/feature/updater-VerCheck
Сравнение с версией на гитхабе в Updater.
2019-01-24 20:00:04 +07:00
zaxar163
7abd9898c8
Merge branch 'dev' into 'feature/updater-VerCheck' 2019-01-24 15:45:36 +03:00
zaxar163
e7970bdbb3
[FIX] Фикс проверки версии. 2019-01-24 15:43:39 +03:00
Gravit
f5ef34ce32 [FIX] Фикс распаковки врапперов 3 2019-01-24 17:16:03 +07:00
Gravit
51ce84152c [FIX] Фикс распаковки врапперов 2 2019-01-24 17:08:45 +07:00
Gravit
44d9be49da [FIX] Фикс распаковки врапперов 2019-01-24 16:38:56 +07:00
Gravit
752a29449f [FIX] Врапперы не распаковываются 2019-01-24 16:09:41 +07:00
zaxar163
2a59e8fe0b
[FIX] Исправлена логика выявления типа версии - часть 2. 2019-01-22 22:12:56 +03:00
zaxar163
012870cf26
[FIX] Фикс багов Updater 1 часть - фикс копипаста. 2019-01-22 21:25:51 +03:00
zaxar163
9c34019446
[FIX] Игнорирование ошибок при получении последнего тега. 2019-01-22 16:52:32 +03:00
zaxar163
d62d039a6a
[FIX] Сравнение версии на гитхабе с текущей, а не просто вывод. + [FEATURE] Возможность выключения оповещения об обновлениях. 2019-01-22 16:49:58 +03:00
zaxar163
f430879e14
[ANY] Обновлены модули. 2019-01-22 15:46:59 +03:00
Gravit
5b59d6ba35
Merge branch 'feature/profile-uuid' into dev 2019-01-22 12:30:30 +07:00
Gravit
97f9f034e7
[FIX] Фикс runtime для работы с новыми опциональными модами 2019-01-22 12:29:57 +07:00
Gravit
8e2e9d4aee
[FEATURE] Поддержка дизайном новых опц модов 2019-01-22 12:02:58 +07:00
Gravit
4d7fca7b2a
[FIX] Сериализация OptionalType 2019-01-22 11:54:53 +07:00
Gravit
acd3c0258c
[FIX] Фикс ошибки компиляции в ClientProfile 2019-01-22 11:40:40 +07:00
Gravit
6d39f514ca
[FEATURE] Перестройка optionalClientArgs/optionalJVMArgs/optionalClassPath 2019-01-22 11:38:41 +07:00
Gravit
1a1c6b6c5a
[FEATURE] Введение общего интерфейса для всех Optional 2019-01-22 11:18:48 +07:00
Gravit
792755f097
[FEATURE] Исправление работы wrapper'ов 2019-01-22 10:33:14 +07:00
Gravit
6ec8267001
[FEATURE] JsonLongFilePermissionsHandler 2019-01-21 20:54:50 +07:00
Gravit
387c786eef
[FEATURE] Функция toLong и возможность написания своих permissions 2019-01-21 20:42:26 +07:00
Gravit
f761460122
[FEATURE] 4 новых permissions 2019-01-21 20:38:51 +07:00
Gravit
c865a8fec8
[FIX] Фикс пермишшенов в MySQLAuthProvider RequestAuthProvider 2019-01-21 20:31:37 +07:00
Zaxar163
4adb51f6cf [FIX] parentRel теперь обновляется. 2019-01-21 20:13:34 +07:00
Gravit
7e8e332891
Merge pull request #158 from GravitLauncher/feature/checkUpd
[FEATURE] Уведомление о latest релизе на github.
2019-01-21 20:09:29 +07:00
zaxar163
9e4df1d196 [FIX] Теперь GC не съест Updater.
Signed-off-by: zaxar163 <zahar.vcherachny@yandex.ru>
2019-01-21 16:06:13 +03:00
Gravit
e82ed5cb9c
Merge tag 'v4.2.2' into dev
Release 4.2.2
2019-01-21 19:59:57 +07:00
Gravit
767feff6b9
Merge branch 'release/4.2.2' 2019-01-21 19:59:34 +07:00
Gravit
e29cb1b5a4
[ANY] 4.2.2-b1 2019-01-21 19:59:21 +07:00
zaxar163
237a2a2f92
[FEATURE] Уведомление о latest релизе на github. 2019-01-21 12:11:56 +03:00
Gravit
f74b5cd1d9
[FIX] Фиксы работы загрузки своей джавы 2019-01-21 16:08:49 +07:00
Gravit
642038576a
[FEATURE] LauncherGuardInterface 2019-01-21 15:52:08 +07:00
Gravit
ec0948594d
[ANY] GITCONVENTION.md -> CODEOFCONDUCT.md 2019-01-19 08:53:26 +07:00
Zaxar163
f463e995dc [STYLE] Удалены лишние импорты + [ANY] Обновлены модули. (#149) 2019-01-19 08:46:21 +07:00
Zaxar163
f00c0489a7 Выполнил ревью кода с правками. (#153)
* [ANY] Автоматический запуск task build при запуске gradle без параметров.

* [ANY] Пересмотр modulesManager.

* [ANY] Закончен review libLauncher`а.

* [FIX] Logger и ServerWrapper или e.printStackTrace вместо нормального логгирования.

* [ANY] Разгрёб auth* и hwidHandler.

* [FEATURE] Modules этап finish. + [FIX] Правки LauncherEngine.

* [FIX] Проверки безопасности в loadModuleFull. + [FIX] finishModules в launchServer.
2019-01-18 05:30:55 +07:00
Gravit
25a0287f1d
[ANY] Добавил .PVS-Studio в .gitignore 2019-01-18 05:26:18 +07:00
Zaxar163
714d33d25f
[FIX] Исправлено имя чистого jarника. 2019-01-16 16:20:12 +03:00
Zaxar163
b3c3ccea90
[FIX] Исправлена команда перезапуска. 2019-01-16 11:52:47 +03:00
Gravit
6db5d818b0
[FIX] Исправлены уровни логгирования для некоторых сообщений 2019-01-15 11:05:24 +07:00
Gravit
aceb06bc9d
[FEATURE] Введение нового уровня логгирования: dev 2019-01-15 10:57:31 +07:00
Gravit
9b7dec7360
[ANY] Обновление gradlew wrapper 2019-01-15 10:38:30 +07:00
Gravit
9884730b1b
[ANY] IDEA Code Reformat 2019-01-15 10:35:40 +07:00
Gravit
a2b3ac523b
[ANY] IDEA Code Cleanup 2019-01-15 10:32:46 +07:00
Gravit
dc6e87ef30
Merge branch 'dev' of github.com:GravitLauncher/Launcher into dev 2019-01-15 09:25:09 +07:00
Gravit
302a606d22
[FEATURE] apiKey в JsonHWIDHandler и JsonAuthProvider 2019-01-15 09:24:29 +07:00
Gravit
e08378813a
Merge pull request #148 from GravitLauncher/feature/readme-nonmust
[DOCS] Правки README.
2019-01-15 09:14:58 +07:00
Zaxar163
aa116cdd4a
[ANY] Правки README. 2019-01-14 12:22:33 +03:00
Zaxar163
3dd775807e [FIX][RUNTIME] Исправлено перемещение мышки после смены оверлея. (#140)
* [UPD] Submodule `modules` updated.

* [FIX] Profiles property: "info" + [FIX] Recenter mouse on stage. + [FIX] Auto-generating config generation (param: "isWarningMissArchJava").

* [FIXED] Access rules in ServerWrapper agent.

* [FIX] Фикс ошибки мержа с master.

* [FIX] AuthProvider в дефолтном конфиге.
2019-01-13 22:51:39 +07:00
Gravit
9bfdcbc622
Merge pull request #145 from yKsenomorf/patch-1
Фикс опечатки
2019-01-13 22:50:49 +07:00
Ksenomorf
1e2363924f
Update ClientLauncherWrapper.java
`Restart Launcher *witch* JavaAgent...`?
2019-01-12 23:04:50 +03:00
Михаил
402ab0e481 [ANY] Собственная Git конвенция 2019-01-12 14:40:33 +07:00
Gravit
681669cad6
[ANY] 4.2.1-b1 2019-01-12 14:37:33 +07:00
Gravit
98b7aac9fd
[FEATURE] optionalJVMArgs, optionalClientArgs и optionalClassPath 2019-01-12 12:04:52 +07:00
Gravit
076dac6a84
[FEATURE] Удаленное управление сервером ExecCommandRequest/ExecCommandResponse 2019-01-12 08:31:15 +07:00
Gravit
790dc5003a
[FEATURE] serverStatusCommand 2019-01-12 07:55:36 +07:00
Gravit
68540a1c44
[FEATURE] ModulesConfigManager 2019-01-12 07:13:24 +07:00
Gravit
fa531a7b55
[FEATURE] параметры logFile и stopOnError в ServerWrapper 2019-01-12 06:35:04 +07:00
Gravit
9626185dbe
[MODULES][FEATURE] AutoSaveSessionsModule 2019-01-12 06:08:40 +07:00
Gravit
1af6c27d3e
[ANY] 4.2.0-b1 stable 2019-01-12 04:01:16 +07:00
Gravit
75238943e4
[FIXED] info в конфигах по умолчанию 2019-01-12 04:00:00 +07:00
Gravit
35cfccba16
Merge branch 'master' of github.com:GravitLauncher/Launcher 2019-01-12 01:17:41 +07:00
Gravit
9ab1185cfb
[FEATURE] Проверка на null для самых распространенных authHandler/authProvider 2019-01-12 01:16:06 +07:00
sanik2021
c7055129b6 Исправление работы описания сервера (#139) 2019-01-10 06:40:47 +07:00
Gravit
8d8eb2e9a3
Опечатка ConfigCommand 2019-01-10 03:36:02 +07:00
Gravit
7f4c1e0dbf
Фикс скинов 2019-01-10 00:34:54 +07:00
zaxar163
38f26ef793
Merge branch 'master' of github.com:GravitLauncher/Launcher 2019-01-09 20:11:48 +04:00
Gravit
1797a1e5a6
Вернул libLauncher 2019-01-10 00:09:05 +07:00
zaxar163
417db979f4
[FIX] Bug with AttachJarsTask, this bug lose AutogenConfig. 2019-01-09 20:09:51 +04:00
Zaxar163
288fc7e70b Config fix (#137)
* Removed unnecessary conf.

* Config bugs fixes.

* Organize imports.
2019-01-09 22:03:14 +07:00
Gravit
8653de90d4
Merge pull request #132 from GravitLauncher/addTasks
Building tasks improvements.
2019-01-09 21:30:55 +07:00
zaxar163
96e9cabc6b
Last fixes. 2019-01-09 16:10:17 +04:00
zaxar163
3908351a5d
IsEmpty runtime fix. 2019-01-09 15:56:18 +04:00
zaxar163
d3db63aba3
NPE runtime fix. Also allow empty passwords. 2019-01-09 13:53:59 +04:00
zaxar163
5b21ad4d7b
Critical bug fix. 2019-01-09 13:42:36 +04:00
zaxar163
a032e1546a
Final fixes. 2019-01-09 13:20:31 +04:00
zaxar163
329f38b1cc
Some fixes. 2019-01-09 13:08:43 +04:00
zaxar163
f011b08b12
Libraries dir also for every depend... Next is SignerJar. 2019-01-09 12:42:20 +04:00
zaxar163
59063daed3
Gradle build change. 2019-01-09 12:29:54 +04:00
Gravit
2a957a6303
Фикс indexAsset 2019-01-09 06:41:31 +07:00
zaxar163
de22bd3d33
Last fix before gradle scripts update and SignerJar restore. 2019-01-08 19:29:24 +04:00
zaxar163
81ef824b85
Attach jars and new adding libs system p.1 2019-01-08 18:18:35 +04:00
zaxar163
349bfc82fb
Last exc fix. 2019-01-08 18:03:28 +04:00
zaxar163
b984fa9d73
Next IOExc fix. 2019-01-08 18:01:59 +04:00
zaxar163
78def447ce
Fixed launcherBinary NPE. 2019-01-08 17:57:01 +04:00
zaxar163
5ba69c155a
Delete temp files mode. 2019-01-08 17:50:40 +04:00
zaxar163
a238f79fe6
Also fixes. 2019-01-08 17:42:48 +04:00
zaxar163
d250b6432c
Errors fix. 2019-01-08 17:39:49 +04:00
zaxar163
494d83ae92
Binary logic changes. 2019-01-08 17:36:05 +04:00
Gravit
669ca83bec
Описание севера из профиля 2019-01-07 16:15:17 +07:00
Zaxar163
5ee0ed089e Asm fix. (#126)
* Formatting fixes. (TODO: reformat by IDEA)

* Working transformers.

* Remove line numbers option.

* Remove some comments.

* Closing fix.

* ClientLauncher fixes.

* Final fixes.

* Last fix.

* Small fix.
2019-01-07 12:01:15 +07:00
Yaroslavik
dece60b8f8 Clearing the old code.
Как я понимаю, оно уже не нужно.
Что-бы не вводить в заблуждение пользователей. 
Теперь все эти настройки в профайле клиента.
```
"updateOptional": [
	{
		"file": "mods/modname.jar",
		"info":"Описание модификации",
		"name":"Имя модификации",
                "dependenciesFile": ["mods/dependMod.jar"],
                "conflictFile": ["mods/conflictMod.jar"],
                "mark": true,
                "subTreeLevel": 1,
                "isAdminOnly": false
	}
]
```
2019-01-06 22:46:42 +07:00
Gravit
742e432657
Скрипт привязки к ASFramework 2019-01-06 22:15:31 +07:00
Gravit
5af607327b
Фикс распаковки рантайма 2019-01-06 19:35:07 +07:00
Gravit
d2858f7c37
Удаление легаси говнокода 2019-01-06 19:20:25 +07:00
Gravit
9e0c94581c
LauncherBuildTask введение новой системы сборки лаунчера
Часть 3
2019-01-05 22:46:07 +07:00
Gravit
18020a78d3
LauncherBuildTask введение новой системы сборки лаунчера
Часть 2
2019-01-05 22:28:25 +07:00
Gravit
4e1f268d4f
LauncherBuildTask введение новой системы сборки лаунчера
Часть 1
2019-01-05 22:15:19 +07:00
Gravit
2590c97061
Обновление модулей 2019-01-05 01:05:27 +07:00
Gravit
104ece2be4
Возможность сделать опциональные моды только для админов 2019-01-04 23:01:45 +07:00
Gravit
02c82745d0
ServerWrapper и лаунчер знает ClientPermissions 2019-01-04 22:46:04 +07:00
Gravit
ece52dd025
Сохранение сессий лаунчера при старте клиента 2019-01-04 22:30:19 +07:00
Gravit
0c9bb41bee
Закрытие доступа неавторизированным к checkServer/joinServer 2019-01-04 22:22:40 +07:00
zaxar163
a8153c9101 Thread count automatically creating fix. 2019-01-04 21:48:03 +07:00
Gravit
b49d17a018
RuntimeProvider 2019-01-04 21:47:23 +07:00
Gravit
1b374c3093
Открыта ветка 4.2.0 2019-01-04 21:25:33 +07:00
Gravit
a7c3edc9d1
Опечатка в JS 2019-01-04 20:52:40 +07:00
Gravit
9bad1e3f3f
Исправление перемещения директории загрузок 2019-01-04 20:37:34 +07:00
Gravit
88510bb270
4.0.0-b8 2019-01-04 18:36:19 +07:00
Zaxar163
34711eea80 Restart command. (#121) 2019-01-04 18:32:16 +07:00
Gravit
3fe5a34029
initGson в ServerWrapper 2019-01-04 18:19:34 +07:00
Gravit
b70e781fa7
Фикс AuthServer 2019-01-04 17:59:01 +07:00
Gravit
92c5989b5e
Варнинг при отсутствии профиля 2019-01-04 17:46:39 +07:00
Gravit
d6b8394016
Исправлегия автосгенерированного конфига 2019-01-03 22:23:11 +07:00
Gravit
45666e6090
Проверки на null для "защиты от дурака" 2019-01-03 22:17:15 +07:00
Gravit
1b12dd895a
Фикс NPE при отсутствии title 2019-01-03 22:10:23 +07:00
Gravit
7ed237c567
Обновление модулей 2019-01-03 21:46:45 +07:00
Gravit
e525842d24
Команда debug для stacktrace 2019-01-03 21:32:10 +07:00
Gravit
baaf2ec74e
STACKTRACE_PROPERTY корректно передается 2019-01-03 21:28:16 +07:00
Gravit
bac74a7d4f
Фиксы ServerWrapper 2019-01-03 21:22:59 +07:00
Zaxar163
f812129d81
Modules upd + Integer -> int. (#117) 2019-01-03 12:33:14 +03:00
Zaxar163
3d8700d727
AsmFix (#118)
* AsmFix P1

* ASMFix P2 или как asm 7 тупит.
2019-01-03 11:27:08 +03:00
Gravit
8d34ae76fc
Администраторы игнорируют profile whitelist 2019-01-02 22:34:18 +07:00
zaxar163
c8b4500f1d Pattern fix. 2019-01-02 22:29:32 +07:00
zaxar163
f56c26ad2b LaunchServer code optimizations. 2019-01-02 22:29:32 +07:00
Gravit
3a8f4dcadc
Обновление модулей 2019-01-02 21:59:27 +07:00
zaxar163
4538749192 Upd modules + node transformer fix. 2019-01-02 21:58:12 +07:00
Gravit
2ee43370b2
Обновление модулей 2019-01-02 21:57:11 +07:00
Gravit
1595a64c61
Еще один readString(0) 2019-01-02 21:11:21 +07:00
Gravit
1c4720256a
4.1.0-b7 2019-01-02 20:01:58 +07:00
Gravit
fe9551636e
Фикс уязвимости, позволяющей положить лаунчсервер запросами с невалидной длинной 2019-01-02 18:54:17 +07:00
Gravit
82ee2e43c3
Исправление mainclass anti-ddos module 2019-01-02 18:41:46 +07:00
Gravit
8cf515ec13
Обновление модулей 2019-01-02 18:39:25 +07:00
Gravit
7d89dc1c70
Фиксы SocketHookManager
Travis.CI
2019-01-02 18:27:55 +07:00
Gravit
b892d50e6d
Travis.CI 2018-12-31 15:41:03 +07:00
Gravit
b0a45a21f4
Обновление библиотек 2018-12-31 15:29:07 +07:00
Gravit
b5e6258353
checkServerHook joinServerHook 2018-12-31 15:12:58 +07:00
Gravit
edaf4d2ad6
HookManager вынесены в пакет ru.gravit.launchserver.managers.hook 2018-12-31 14:53:07 +07:00
Gravit
fe2177151e
AuthHookManager 2018-12-31 14:51:49 +07:00
Gravit
726bcff1b4
Фикс JsonHWIDHandler 2018-12-30 01:58:58 +07:00
Gravit
49c53d4b35
Кеширование HardwareAbstractionLayer 2018-12-29 17:39:04 +07:00
Gravit
22763f3439
try catch на получение HWID 2018-12-29 17:33:59 +07:00
Gravit
9af4145ab7
Кеширование HWID, получение HWID в отдельном потоке 2018-12-29 17:26:56 +07:00
Gravit
cf5867c131
SocketHookManager fix 2018-12-29 17:20:51 +07:00
Gravit
4d7234512c
SocketHookManager 2018-12-29 17:00:50 +07:00
Gravit
92a253eb82
Фикс краша клиента при использовании длинных skinURL/cloakURL или %uuid% 2018-12-27 16:31:29 +07:00
Gravit
edf6adafe0
Фикс записи опциональных модов 2018-12-27 15:10:21 +07:00
Gravit
4792e0453e
Полноценный граф зависимостей опциональных модов на Java 2018-12-27 14:53:49 +07:00
Gravit
005507a3a3
Фикс опциональных модов 2018-12-27 14:12:40 +07:00
Gravit
19fa135a61
Merge pull request #113 from sanik/master
Fixed MysqlHWIDHandler
2018-12-27 12:50:13 +07:00
sanik2021
935ecfbeec
Merge pull request #1 from GravitLauncher/master
Fixed
2018-12-26 21:20:56 +03:00
sanik2021
8a426914f0 Fixed MysqlHWIDHandler 2018-12-26 20:31:35 +03:00
Gravit
563153a6d0
Опечатка в станадртном порте 2018-12-26 22:41:24 +07:00
Gravit
78f9fed6e1
Фикс RequestAuthProvider 2018-12-26 22:12:41 +07:00
Gravit
4828e8e895
Обновление конфига ServerWrapper 2018-12-26 21:19:31 +07:00
Gravit
90103d16f4
Обновление основного конфига 2018-12-26 21:13:50 +07:00
Gravit
e4f4d1861b
Обновление профилей 1.4.7, 1.5.2, 1.6.4 2018-12-26 21:12:19 +07:00
Gravit
fd45038b91
Обновление профилей 1.7.2, 1.8.9, 1.9.4, 1.10.2, 1.11.2, 1.13.1, 1.13 2018-12-26 21:05:32 +07:00
Gravit
42c303d90a
Поднят settings handshake 2018-12-26 20:54:48 +07:00
Gravit
e8a4fbd7a3
Текущая версия: 4.1.0-b6 beta 2018-12-26 20:49:44 +07:00
Gravit
426c7be60d
4.1.0-b5 beta 2018-12-26 20:46:29 +07:00
Gravit
6bc949752d
Merge pull request #110 from GravitLauncher/optimizations
Optimizations
2018-12-26 20:31:30 +07:00
zaxar163
ebdc354468
Fixes. 2018-12-26 16:27:39 +03:00
zaxar163
7f74005454 Merge remote-tracking branch 'origin/master' into optimizations 2018-12-26 16:25:17 +03:00
Zaxar163
94c1cecd14
Merge branch 'master' into optimizations 2018-12-26 16:20:27 +03:00
Gravit
5f14c79415
SwapAuthProviderCommand фикс 2018-12-26 20:19:53 +07:00
Gravit
245db2dda5
SwapAuthProviderCommand 2018-12-26 20:18:06 +07:00
zaxar163
ff7887a006 Some fixes. 2018-12-26 16:17:47 +03:00
Gravit
b0b2493935
Управление whitelist с помощью Reconfigurable 2018-12-26 20:01:36 +07:00
Gravit
56e5874205
Инициализация Reconfigurable при старте лаунчсервера 2018-12-26 19:54:23 +07:00
Gravit
c64d3b1f42
PermissionsManager удален за ненадобностью 2018-12-26 19:51:40 +07:00
zaxar163
ddeefc03b0 Fixed Stopped messange on start. 2018-12-26 15:44:35 +03:00
Gravit
40036362f9
reloadInfo переименован в reloadList 2018-12-26 19:41:39 +07:00
Gravit
73dfdd1494
Reconfigurable и команды config/configHelp/configList 2018-12-26 19:40:53 +07:00
zaxar163
1a562792cf Refactor with warns fix. 2018-12-26 15:33:49 +03:00
Gravit
bac2ac9d50
Фикс MySQLAuthHandler 2018-12-26 19:24:38 +07:00
Gravit
c7c270fc2c
Reload,ReloadAll,ReloadInfo commands 2018-12-26 19:10:56 +07:00
Gravit
172eb97ce6
JsonFilePermissionsHandler теперь Reloadable 2018-12-26 19:03:34 +07:00
Gravit
e341f144b9
ReloadManager и ReloadCommand 2018-12-26 18:54:24 +07:00
Gravit
05bad22ede
Фикс инициализации MySQLAuthHandler 2018-12-26 18:35:28 +07:00
Gravit
84a6784d26
Изменен порядок значений на более привычный 2018-12-26 18:21:08 +07:00
Gravit
291f6e4405
Несколько стандартных PermissionsHandler 2018-12-26 18:09:35 +07:00
Gravit
a606cb23e1
Полноценный выбор PermissionsHandler 2018-12-26 18:04:45 +07:00
Gravit
4c1fae008f
Whitelist для RejectAuthProvider 2018-12-26 16:41:11 +07:00
Gravit
0862e3c541
Фитча для модулей - список файлов в jar лаунчера
Упрощает процедуру внедрения своих файлов в JAR
2018-12-26 16:34:18 +07:00
Gravit
e915d408a9
Команда dumpEntryCache 2018-12-24 20:15:53 +07:00
Gravit
19509d7ac5
Launch4J конфиг по умолчанию 2018-12-24 19:16:44 +07:00
Gravit
db1abf9a17
Фикс ошибки с DownloadAsset/DownloadClient 2018-12-24 19:12:39 +07:00
Gravit
1c5741d0d8
4.1.0-b4 experimental 2018-12-24 17:17:24 +07:00
Gravit
5eac763f8f
Правки конфига по умолчанию 2018-12-24 17:16:57 +07:00
Gravit
8df7d148da
Разделение на человекочитаемый gson и машинный 2018-12-24 17:10:53 +07:00
Gravit
7e97915fd1
PermissionsManager на случай, если authProvider не обрабатывает привилегии
Загрузка привилегий из файла permissions.json
2018-12-24 17:00:09 +07:00
Gravit
232aeb5c68
Возможность перезапускать лаунчсервер без потери сессий на клиентах 2018-12-24 16:23:00 +07:00
Gravit
d94e8f22e1
Обновление субпроекта LauncherModules на последний коммит 2018-12-24 15:15:37 +07:00
Gravit
f58d387d92
Исправления DownloadClientCommand и стандартных профилей 1.12.2 и 1.7.10 2018-12-24 14:58:28 +07:00
Gravit
c65124a21e
Перевод конфигов на Json часть 9
Порция фиксов
Теперь работает!
2018-12-24 14:51:13 +07:00
Gravit
08d7f61a19
Перевод конфигов на Json часть 8
Порция фиксов
Комплируется, пока не работает
2018-12-24 12:51:47 +07:00
Gravit
28cb9b0f23
Перевод конфигов на Json часть 7
Порция фиксов
Комплируется, пока не работает
2018-12-24 00:45:16 +07:00
Gravit
137b83f428
Перевод конфигов на Json часть 6
Адаптеры
Комплируется, пока не работает
2018-12-24 00:19:43 +07:00
Gravit
2c06cdec24
Перевод конфигов на Json часть 5
Правки рантайма
Комплируется, пока не работает
2018-12-23 23:47:07 +07:00
Gravit
123250246c
Перевод конфигов на Json часть 4
Правки рантайма
Комплируется, пока не работает
2018-12-23 23:26:57 +07:00
Gravit
79891d711e
Перевод конфигов на Json часть 3
Комплируется, пока не работает
2018-12-23 23:22:19 +07:00
Gravit
7c35cb0a34
Перевод конфигов на Json часть 2
Не комплируется
2018-12-23 22:57:40 +07:00
Gravit
49b085278c
Перевод конфигов на Json часть 1
Не комплируется
2018-12-23 22:50:31 +07:00
Gravit
d2916d180d
IDEA Code Refractor 2018-12-20 22:52:09 +07:00
Gravit
87669d1d46
IDEA Code Reformat 2018-12-20 22:45:01 +07:00
Gravit
e15e4c1e35
Возможность отключить предупреждение о неверной архитектуре Java и ОС 2018-12-20 22:43:01 +07:00
Gravit
f5534a1f67
Открыта возможность инструментации LaunchServer 2018-12-20 22:36:02 +07:00
Gravit
df5d3e8020
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-12-20 16:38:01 +07:00
Gravit
4db1bd6d75
Техническая реализация поиска модов в других клиентах
Не тестировалась на работоспособность
Вычисление хеша и обход всех папок обновлений - затратная по диску и процессору операция
2018-12-20 16:37:46 +07:00
Gravit
3654a450f8
Папка лаунчера перемещена в AppData(Windows) .minecraftlauncher(Linux) 2018-12-20 15:35:04 +07:00
zaxar163
1aba7624a1 Commands fixes. 2018-12-19 21:05:40 +07:00
zaxar163
52213d7c55 Applied gradle fix. 2018-12-19 21:05:40 +07:00
Gravit
69a90dc806
Использование isAgentStarted 2018-12-19 20:02:08 +07:00
Gravit
c5d96f173d
Hotfix: Ошибка форматирования 2018-12-19 19:54:17 +07:00
Gravit
01b37db0d2
Обновление ServerWrapper
Фитча добавления classpath
Фитча автозагрузки библиотек(libraries)
Проксирование агента
2018-12-19 19:50:17 +07:00
Gravit
d450a17d58
Правки Hikari кода 2018-12-19 18:54:23 +07:00
Gravit
23966a3b04
Введение LauncherEnvironment 2018-12-19 18:24:50 +07:00
Gravit
99d9533b1c
Текущая версия: 4.0.0-b3 2018-12-19 17:55:20 +07:00
Gravit
3afe8a98dc
4.0.0-b2 2018-12-19 17:50:45 +07:00
Gravit
707d64982a
Обновление gradlew до 5.0 2018-12-19 17:47:16 +07:00
Zaxar163
4e7e3c7680
Merge pull request #104 from yaroslav4167/patch-22
Correcting typos
2018-12-17 15:15:40 +03:00
Yaroslavik
39a5cee1c2
Correcting typos 2018-12-16 16:25:02 +02:00
Zaxar163
d5a7dd5d44
Merge pull request #103 from GravitLauncher/v4.1.x
V4.1.x
2018-12-14 21:30:20 +03:00
Zaxar163
7b345f2302
Merge pull request #101 from GravitLauncher/master
IOOBE Fix #2
2018-12-14 17:02:34 +03:00
Yaroslavik
5d570ed022 IOOBE Fix #2
А если профайл удалили, а у пользователя до сих пор выбран этот сервер?!
Верно! Крушиться с истериками!
Либо подыматься до последнего существующего клиента, что и подразумевает данная правка.
2018-12-14 20:57:30 +07:00
Zaxar163
2a9e1258b5 SKIP_FRAMES зачем то пихнул, это как пихнуть SKIP_CODE. 2018-12-06 19:44:46 +07:00
Gravit
2f56328780
Merge branch 'v4.1.x' of github.com:GravitLauncher/Launcher into v4.1.x 2018-12-06 10:24:37 +07:00
Gravit
f6b0255ee6
Получение объема памяти с помощью OSHI 2018-12-06 10:24:02 +07:00
Anatoliy
e7846adaf2 Update JVMHelper.java
Optimized "for" loop
2018-12-06 09:30:00 +07:00
Zaxar163
1b516ccf2f Safe classWriter. (#92)
* ClassWriter hierarchy...

* Some improvements of jar building.

* Modules updated.

* Fixed modules... Again.

* Выловил заразу всё таки...

* Update modules to use SafeClassWriter.

* To Strings...

* Organize imports.
2018-12-06 09:29:34 +07:00
Gravit
6f4a4b60bc
Использование максимально большого жесткого диска для серийника 2018-12-03 18:24:02 +07:00
Gravit
21824962b9
Расширенный отладочный вывод HWID 2018-12-03 18:13:34 +07:00
Gravit
2c04ddb514
Proguard конфиг для работы OSHI 2018-12-03 17:47:22 +07:00
Gravit
6cfb3b3dad
Исправления OSHI HWID 2018-12-03 17:44:39 +07:00
Gravit
6692a01fb1
Исправление RequestWorker 2018-12-03 17:13:24 +07:00
Gravit
f25585abe1
Забытые static 2018-12-03 17:03:54 +07:00
Gravit
eedd70061f
Фикс стандартного конфига 2018-12-03 16:59:31 +07:00
Gravit
6df2b97041
Merge pull request #90 from GravitLauncher/v4bugfix
Fixed runtime issue.
2018-12-03 16:51:20 +07:00
zaxar163
21209083be
Fix issue with proguard. 2018-12-02 17:27:58 +03:00
zaxar163
d21558e316
Unpack hashing fixed. 2018-12-02 17:17:04 +03:00
zaxar163
d6d002c2f6
Formatting optimization... 2018-12-02 17:02:13 +03:00
zaxar163
2676cd0dde
Fixed my mistake. 2018-12-02 15:46:21 +03:00
zaxar163
f879c98995
Fix #89. 2018-12-02 15:21:27 +03:00
zaxar163
d6049e71c0
Merge branch 'master' into v4.1.x 2018-11-30 20:52:37 +03:00
Zaxar163
014d3f9c99
Fix docs. (#88)
* Fix docs.

* RU changes mistake fixed.
2018-11-30 20:13:43 +03:00
Zaxar163
92818b12b2
Update LauncherHWIDInterface.java (#86) 2018-11-28 21:09:59 +03:00
Gravit
637867dbc8
Очень странный Баг с NPE 2018-11-29 00:16:38 +07:00
Gravit
b175388465
Вернул предыдущие названия 2018-11-28 21:05:28 +07:00
Gravit
d33d40b9ce
Перенос Bridge обратно 2018-11-28 18:37:36 +07:00
Gravit
c12d93b435
Исправление неверного синтаксиса комантария в дефолтном конфиге 2018-11-28 18:02:35 +07:00
Gravit
16803776d0
Использованеи библиотеки OSHI для получения HWID 2018-11-28 17:54:23 +07:00
Gravit
ed7a09d223
Merge pull request #84 from Ghostlyr/patch-1
Регистронезависимый белый список
2018-11-28 13:38:37 +07:00
Ghostlyr
a1d7fdb2d4
Регистронезависимый белый список 2018-11-27 22:03:19 +06:00
Gravit
e42a88ded9 User-firendly сообщения ServerWrapper 2018-11-27 20:33:41 +07:00
Gravit
07eaa0c691 Вывод информации о лицензии в консоль при запуске 2018-11-27 18:37:37 +07:00
Gravit
3cd15a6168 Avanguard выброшен 2018-11-27 18:19:09 +07:00
Gravit
8597206e84
Merge branch 'master' into v4.1.x 2018-11-26 18:21:53 +07:00
Gravit
444d4a94f1
Merge branch 'v4.1.x' 2018-11-26 18:19:29 +07:00
Gravit
1e35e89d1c
Отказ от buildnumber файла 2018-11-26 18:15:16 +07:00
Gravit
1e54e661f5
Перемещение dirUpdates 2018-11-26 18:09:22 +07:00
Gravit
1eb4066250
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-11-26 17:39:39 +07:00
zaxar163
4140b2ad5b
Fixed binary names... 2018-11-26 11:00:58 +03:00
zaxar163
ebdf52d344 Update dependencies. 2018-11-26 10:53:02 +03:00
zaxar163
7d625b4640
Implemented #82 2018-11-26 10:43:44 +03:00
zaxar163
4727ee9bbf Organize imports. 2018-11-25 21:23:57 +03:00
zaxar163
46ea7c8500 Merge branch 'master' into v4.1.x 2018-11-25 20:45:01 +03:00
Yaroslavik
5a13d56122 Optional mods fix. (#81)
Если модификация была в профайле, но не была в конфиге - дерево модификаций пыталось переключить несуществующую. Что приводило к неправильной работе веток.
2018-11-24 12:18:06 +03:00
Zaxar163
eac2a85478
API reformat. 2018-11-23 17:58:51 +03:00
Zaxar163
3ac30f07d3
Fix API. (#80) 2018-11-23 17:53:03 +03:00
Yaroslavik
23d60cb28f Add Transfer dialog (#74)
Я программист-экономист... Чем я вообще занимаюсь...
2018-11-21 21:59:29 +03:00
Yaroslavik
7e7a3c5fa3 Add transfer dialog (settings.fxml) (#76)
* Add transfer dialog

Добавлен диалог подтверждения/отказа переноса файлов при смене директории.

* Centered buttons...
2018-11-21 21:58:27 +03:00
Yaroslavik
dc3a7542f8 Add transfer dialog (#75) 2018-11-21 21:58:06 +03:00
zaxar163
04149c9491 Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-11-21 21:56:09 +03:00
zaxar163
c4193d27f7
Upd modules. 2018-11-21 21:54:44 +03:00
Yaroslavik
a191c45a57 IOOBE Fix (#73)
Если в клиенте не было профилей - клиент не загружался. (Вечная загрузка)
https://hastebin.com/qesogeyutu.hs
2018-11-21 17:29:57 +03:00
Zaxar163
3c960eb501
Add AuthLimiter IP exclusions.
* Add AuthLimiter IP exclusions #63.
2018-11-20 20:18:18 +03:00
Gravit
e9f0af36c8
Фикс ошибки предвдущего коммита 2018-11-20 22:26:56 +07:00
Gravit
591bdea6f4
Фикс бага с mcheil и уязвимости 2018-11-20 21:50:41 +07:00
Gravit
fb75e7f5a5
4.0.8 2018-11-20 21:47:59 +07:00
Gravit
d89c976a5c
Вынос настройки message в MySQLAuthProvider 2018-11-20 01:19:07 +07:00
Gravit
f965f081db
Исправление проблемы с созданием ServerWrapper.cfg при запуске 2018-11-20 01:16:13 +07:00
Gravit
3b29043dca
Сохранение текущего выбранного профиля 2018-11-20 01:12:58 +07:00
Gravit
2bff9a4e18
Оптимизация хранения ClientProfile 2018-11-14 19:55:53 +07:00
Gravit
4c4ff840d4
Оптимизация списка JVM опций 2018-11-14 19:48:59 +07:00
Gravit
ad924961e6
Отказ от minimal-json в пользу gson 2018-11-14 17:59:55 +07:00
Gravit
d4d4f78387
Merge pull request #64 from GravitLauncher/master
Слияние ветки master с 4.1
2018-11-14 16:49:19 +07:00
Yaroslavik
7c58959e24 Update optional mods.. Again... (#66)
Поддержка многослойного дерева вложенности / новая механика выбора одного из национальных модов.
Сортировка дерева производится так же, как и в прошлой версии (Сначала всё как config.js, потом всё остальное). Необходимо соблюдать порядок, это важно. Т.к. дерево на нём завязано. То есть модификации должны быть по порядку {Кор-мод}{Мод}{Аддон}, с соответствующими им уровнями вложенности.

Теперь выбор "одного из" работает со всеми модами/субмодами. (К примеру: При включении миникарты - отключится неи со всеми его аддонами. Т.к. NEI и миникарта имели общий флаг группы [onlyOneGroup]  и соответственно включенный параметр [onlyOne])

Видео с демонстрацией работы вложенности/зависимости и функции выбора "одного из": https://lww.page.link/FKec
2018-11-14 15:53:39 +07:00
Yaroslavik
93ab36477e Update optional mods.. Again... (#65)
Поддержка многослойного дерева вложенности / новая механика выбора одного из национальных модов.
Сортировка дерева производится так же, как и в прошлой версии (Сначала всё как config.js, потом всё остальное). Необходимо соблюдать порядок, это важно. Т.к. дерево на нём завязано. То есть модификации должны быть по порядку {Кор-мод}{Мод}{Аддон}, с соответствующими им уровнями вложенности.

Теперь выбор "одного из" работает со всеми модами/субмодами. (К примеру: При включении миникарты - отключится JEI со всеми его аддонами. Т.к. JEI и миникарта имели общий флаг группы [onlyOneGroup]  и соответственно включенный параметр [onlyOne])

Видео с демонстрацией работы вложенности/зависимости и функции выбора "одного из": https://lww.page.link/FKec
2018-11-14 15:51:58 +07:00
Gravit
56f81e791a
4.0.7 stable 2018-11-13 19:02:50 +07:00
Gravit
370466dbe7
ООП-like стиль опциональных модов 2018-11-13 17:49:56 +07:00
Yaroslavik
78ecb7ff43 Sorting optional mods, triggering core-mods. (#60)
Сортировка производится по механике: Сначала все моды по порядку как в config.js, а потом всё остальное.

Триггер core-модификации работает так:
Если 2 модификации имеют параметр submod: false и одинаковую группу - то они будут переключатся, при включении одного из них. То есть не возможно будет включить две модификации сразу.
Полезно для тех же различных типов мини-карт.
2018-11-13 09:49:56 +07:00
Yaroslavik
909d55076c Fixed ram lable (lable don't change value when moving the slider) (#61)
Lable don't change value when moving the slider.
2018-11-13 09:49:12 +07:00
Yaroslavik
a80b0d9ccb Names, descriptions, submodifications and switch mechanics for additional mods (#52)
* Names for optional mods

* Names for optional modifications

* Description and submodifications

* Description and submodifications

* Switching tree of mods.

* Switching tree of mods.

* Switching tree of mods. (Damn spaces..)

* Switching tree of mods. (Lost variable)
2018-11-13 00:09:10 +07:00
Gravit
e37dae3a0d
Merge pull request #56 from yaroslav4167/patch-7
CSS fixes with optional mods
2018-11-13 00:08:37 +07:00
Gravit
403da79e0f
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-11-12 22:28:11 +07:00
Gravit
aa91d12d27
Сохранение опциональных модов 2018-11-12 22:27:44 +07:00
Zaxar163
db08bafc40
Fixed double loader (#57) 2018-11-12 08:06:51 +03:00
Yaroslavik
9241c0064f Fixed double loader (#57) 2018-11-12 08:05:57 +03:00
Yaroslavik
e3bd1a2d2e
Names for optional mods 2018-11-11 16:23:22 +02:00
Zaxar163
bf9c232f85
Critical API fix. (#55) 2018-11-11 17:14:13 +03:00
Gravit
ec6e27ab43
Runnable в RequestWorker 2018-11-11 16:17:55 +07:00
Gravit
5c01d5fd17
Thread-safe функции RequestWorker 2018-11-11 16:16:05 +07:00
Gravit
f21572879e
Экспериментальная фитча: RequestWorker 2018-11-11 16:13:14 +07:00
Zaxar163
4300aafc38
Fixed proguard. (#54) 2018-11-11 11:22:11 +03:00
Zaxar163
4dc275bb17 Runtime fixes and improvements. (#43)
* Big fixes of runtime.

* Fixed forms...
2018-11-11 13:58:22 +07:00
Zaxar163
9190fd98d0
Fix patch. (#53)
* Fix patch.

* Update BungeeCord.patch
2018-11-11 09:19:55 +03:00
Zaxar163
b2b810ddea
ThreadCount #49
* #48 выполнено
2018-11-11 09:01:19 +03:00
Zaxar163
ef57f8b02f
Removed plugin-integr. (#47) 2018-11-10 20:47:58 +03:00
Gravit
d2947b811d
4.0.6 2018-11-10 23:18:02 +07:00
Gravit
fab59163dd
Смена settingsMagic 2018-11-10 23:17:16 +07:00
Gravit
c5ec2cf3e1
Обновление дизайна от DrLeonardo 2018-11-10 21:18:14 +07:00
Gravit
eb409dcc01
Фикс варнинга о Java 10 FXML 2018-11-10 20:42:00 +07:00
Gravit
65d62da507
Фикс бага, когда кнопка применить опускалась на задний план 2018-11-08 22:41:54 +07:00
Gravit
e316674946
Обновление дизайна от DrLeonardo 2018-11-08 22:06:02 +07:00
Gravit
b4f097d187
hotfix 2018-11-08 20:03:11 +07:00
Gravit
30ae80c1a1
updateShared 2018-11-08 19:50:24 +07:00
Gravit
874a30eb6b
IDEA Code Reformat 2018-11-08 19:30:16 +07:00
Gravit
f9b8bd2947
IDEA Refractoring 2018-11-08 19:28:31 +07:00
Gravit
6377f9f287
Фикс обновления опциональных модов 2018-11-08 18:50:56 +07:00
Gravit
06c94316dd
Опциональные моды в runtime 2018-11-08 17:41:16 +07:00
Gravit
5ef915c00b
Hotfix рантайма 2018-11-08 13:49:16 +07:00
Gravit
9c5d132ebc
Фикс удаления папки загрузок 2018-11-08 13:36:54 +07:00
Gravit
4a74816634
enabledOptional 2018-11-06 19:14:08 +07:00
Gravit
72701e0775
Дополнительные проверки безопасности 2018-11-06 19:07:15 +07:00
Gravit
d65a60e61d
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-11-06 18:57:46 +07:00
Gravit
9e2a154c50
Запрос ChangeServer 2018-11-06 18:57:19 +07:00
Zaxar163
3962041825 Fix ipb.php! (fixed locale). (#42)
* Fix ipb.php! (fixed locale).

* Fix phpbb.php!

* wordpress.php locale!

* Fix xenforo.php! (locale)

* Update ipb.php

* Fix dle die logging!

* Update dle.php
2018-11-05 16:50:46 +07:00
Gravit
f79799bee1
Новый дизайн с раздельной авторизацией от DrLeonardo 2018-11-04 12:08:37 +07:00
Gravit
c472e8d033
Фиксы SetProfileRequest 2018-11-04 12:03:17 +07:00
Gravit
d845b73c85
Возможность не указывать профиль при авторизации 2018-11-04 11:35:42 +07:00
Gravit
7a7abd09bd
Фикс диалогового окна с выбором папки 2018-11-04 10:34:40 +07:00
Gravit
077c4f4c78
1.13.2 2018-11-03 21:35:47 +07:00
Gravit
c3a040ec25
Фиксы FileNotFoundException и распаковки guard/runtime 2018-11-01 20:45:11 +07:00
Gravit
ef840af7a0
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-11-01 20:03:38 +07:00
Gravit
01355fd93e
Проверка хешей врапперов и авангарда 2018-11-01 20:03:14 +07:00
Gravit
ad8ce5e74e
dialog.js подгружается init.js 2018-11-01 19:39:53 +07:00
Gravit
4ac26bf3d8
4.0.5 2018-11-01 19:22:40 +07:00
Dmitry K
f77ca18878 English translation improvements (#41) 2018-10-31 12:28:56 +03:00
Gravit
897ed1b19e
Исправления автообновления настроек 2018-10-29 16:29:59 +07:00
Gravit
e82359a347
Вернул проверку runtime 2018-10-27 00:23:27 +07:00
Gravit
4f65a0a396
Проверка checkSign в авторизации 2018-10-26 23:59:11 +07:00
Gravit
8594c2f702
Runtime не контролирует процедуру обновления 2018-10-26 23:48:42 +07:00
Gravit
9f0447dc62
Фикс NPE при загрузки авангарда 2018-10-26 22:36:22 +07:00
Gravit
89027479c1
LauncherEngine инициализируется во время загрухки клиента 2018-10-26 22:29:26 +07:00
Gravit
49f6316417
Исправление линковки Avanguard 2018-10-26 22:16:18 +07:00
Gravit
9cdc96eadb
Исправление автосоздания папки guard 2018-10-26 21:58:55 +07:00
Gravit
d2faeec55f
Переименование lastSign в lastDigest 2018-10-26 21:49:36 +07:00
Gravit
23f67c2160
CodeStyle для EnvHelper 2018-10-26 21:42:20 +07:00
Yaroslavik
91f9e11b36 RAM Fix (#40)
Ранее ползунок установки RAM ничего не изменял.
2018-10-26 15:39:20 +03:00
Gravit
65d36cf2e2
Фиксы нового LauncherRequest 2018-10-25 19:49:08 +07:00
Gravit
96bca9aa5d
Крупное обновление LauncherRequest
Есть совместимость с предыдущими версиями
2018-10-25 19:36:57 +07:00
Gravit
23677bd5a3
Фикс распаковки wrapper'ов 2018-10-25 18:04:18 +07:00
Gravit
e286c951df
UnpackHelper 2018-10-25 17:53:12 +07:00
Gravit
a944282469
JVM Halt через несуществующий нативный метод 2018-10-25 15:57:58 +07:00
Gravit
d6f203d9bf
Большинство аннтоаций LauncherAPI удалены из SecurityHelper 2018-10-25 15:43:42 +07:00
Gravit
5155bf292a
Фиксы враппера 2018-10-24 20:40:51 +07:00
Gravit
e5478930b4
Экспериментальная функция launchLocal 2018-10-23 20:14:14 +07:00
Gravit
2e0e187ffc
Переопределение nativePath в PublicURLClassLoader 2018-10-23 19:59:39 +07:00
Gravit
82858575c7
Merge pull request #36 from yaroslav4167/patch-1
Disable resizable button
2018-10-22 18:55:34 +07:00
Gravit
4c629fb930
Удалены устаревшие методы 2018-10-22 18:53:01 +07:00
Gravit
ec3a1d9bb0
Передача launcher.debug 2018-10-22 18:47:26 +07:00
Gravit
300e8cfcec
Экспериментальный класс ClientLauncherWrapper 2018-10-22 18:38:01 +07:00
Gravit
761ddc3087
Экспериментальная защита на основе StackTrace 2018-10-22 18:05:10 +07:00
Gravit
4e75894438 Фикс чита на основе глобальных переменных часть 2 2018-10-22 14:15:44 +07:00
Zaxar163
6091be7606 Critical fixes NPE. 2018-10-22 08:28:19 +03:00
Gravit
01fd6d2689
Фикс обхода на основе глобальных переменных 2018-10-22 00:09:32 +07:00
Gravit
d84193d5a4
Java реализация settings часть 2 2018-10-22 00:01:23 +07:00
Gravit
67849bc1be
Введение настроек на стороне Java часть 1
Не комплируется
2018-10-21 19:12:36 +07:00
Gravit
ac643bf322
Java реализация settings 2018-10-21 17:57:01 +07:00
Gravit
c95e3ff232
verifyHDir больше не доступен из runtime 2018-10-21 17:25:20 +07:00
Gravit
bc62dc3416
FunctionalBridge 2018-10-21 17:22:29 +07:00
Gravit
e4c1a8ce96
Введение DirBridge 2018-10-21 17:04:06 +07:00
Gravit
ecb904035a
Техническая возможность использования своей JVM 2018-10-20 16:33:02 +07:00
Gravit
8d7db40909
Возможность изменять профиль после авторизации 2018-10-20 15:57:30 +07:00
Yaroslavik
35862d7c11
Disable resizable button
Why this button if there is not a scalable design?
2018-10-18 18:20:04 +02:00
Gravit
830786614f
Исправление битности AES ключа 2018-10-18 22:35:16 +07:00
Gravit
354974a0c7
4.0.3 2018-10-18 22:08:46 +07:00
Gravit
7f470ab3e3
Отключена проверка в CheckServerRequest. Авторизация не теряется 2018-10-18 22:06:26 +07:00
Gravit
b83666a584
Запрет добавления и удаления обработчиков во время впыолнения 2018-10-18 21:48:44 +07:00
Gravit
40392f24cd
Функции start/stop 2018-10-18 21:46:14 +07:00
Gravit
fc6a29cfa2
Изменение интерфейса 2018-10-18 20:57:49 +07:00
Gravit
78d6321f9f
IDEA Generify 2018-10-18 20:56:33 +07:00
Zaxar163
3013e88103 Update EventHandler.java 2018-10-18 20:51:31 +07:00
Gravit
01fdbdf305
Базовые события 2018-10-18 20:47:49 +07:00
Gravit
5c99ffd69a
Система событий 2018-10-18 20:25:57 +07:00
Gravit
e5d3dd9a03
Техническая возможность сравнения директорий, а значит и поиска файлов в других клиентах 2018-10-18 19:22:29 +07:00
Gravit
615ed25e00
Введение MirrorManager, теперь можно создавать свои "зеркала", откуда можно скачивать клиенты и ассеты. Список зеркал указывается в LaunchServer.cfg
Модули могут добавлять свои зеркала
2018-10-18 16:39:36 +07:00
Gravit
81a867e631
Изменен config.js по умолчанию 2018-10-18 15:41:51 +07:00
Gravit
eb5864e9c7
4.0.2 2018-10-13 15:32:11 +07:00
Gravit
e126623b6f
Проверки на краш процесса 2018-10-13 15:30:58 +07:00
Gravit
441fdc92a4
Проверка на Java 11 2018-10-13 15:23:47 +07:00
Gravit
a9a9a78983
Случайный порт при передаче параметров 2018-10-13 15:20:23 +07:00
Gravit
311fee0443
Чистка LauncherAPI 2018-10-13 15:01:10 +07:00
Gravit
bae9a511bc
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-10-13 12:00:57 +07:00
Gravit
b4cd10ef85
Возможность сборки Avanguard для каждого проекта отдельно 2018-10-13 11:59:50 +07:00
Vladimir Votyakov
76dd4ce250 Allow to disable Avanguard (#33) 2018-10-12 17:04:17 +07:00
Vladimir Votyakov
1bb8b4621b Fix Authlib obfuscation (#32)
Proguard obf fixed.
2018-10-10 15:59:23 +03:00
Gravit
4a2b535403
Фикс для BungeeCord 2018-10-09 18:57:32 +07:00
Gravit
16f12d54f9
Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-10-09 18:54:26 +07:00
Gravit
540a2d85a3
Асинхронная авторизация ServerWrapper 2018-10-09 18:37:46 +07:00
Gravit
eef3d38f73 Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-10-08 21:13:16 +07:00
Gravit
1115935a3a Полностью отключены СlientParams*.bin 2018-10-08 21:10:41 +07:00
Gravit
5fc4b01b8a Шифрование AccessToken 2018-10-08 20:57:29 +07:00
Gravit
2486c868b3
Версия 4.0.1-beta 2018-10-07 20:15:47 +07:00
Zaxar163
c0ccb4e5d3 Readme fix. (#31) 2018-10-07 16:49:28 +07:00
Gravit
ed826472e0 Фикс ServerWrapper.cfg 2018-10-07 16:25:20 +07:00
Gravit
aedddbff0d Обновление JAConfigurator 2018-10-07 16:06:07 +07:00
Gravit
abcf980844 Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-10-07 14:18:27 +07:00
Gravit
f5289e7681 Защита от хаков протокола. Авторизация сервера ОБЯЗАТЕЛЬНА 2018-10-07 14:17:37 +07:00
Gravit
b285c81c09 Первое же срабатывание защиты крашит процесс 2018-10-07 13:59:28 +07:00
Zaxar163
953f316908 Delete Launcher.pro (#30)
* Delete Launcher.pro

* Delete dictionary.pro
2018-10-06 13:35:23 +07:00
Gravit
6167699c20 Клиент WebSockets 2018-10-05 16:20:40 +07:00
Gravit
7ae32bf1e7 Удаленный вызов комманд 2018-10-05 15:36:50 +07:00
Gravit
f9aecb5036 Поддержка привилегий в JsonAuthProvider.java MySQLAuthProvider.java RequestAuthProvider.java 2018-10-05 15:25:12 +07:00
Gravit
bbe3a5b111 Merge branch 'master' of github.com:GravitLauncher/Launcher 2018-10-05 14:51:09 +07:00
Gravit
75eca120f0 Обновление wrapper'ов 2018-10-05 14:50:47 +07:00
Zaxar163
71efde7cd2 Fix paths. (#29) 2018-10-03 15:12:48 +07:00
Gravit
895253012f ProGuard для gson забытые строчки 2018-10-02 20:58:37 +07:00
Gravit
73c3dec29f ProGuard для gson 2018-10-02 20:57:19 +07:00
Gravit
b141d14d74 UpdateListResponse 2018-10-02 20:38:03 +07:00
Gravit
f27ec8cb7f Сериализация HashedDir в json 2018-10-02 20:25:07 +07:00
Gravit
788eb253f4 Update FileServerHandler 2018-10-02 19:51:07 +07:00
Gravit
e8126f565d Фикс LauncherResponse 2018-10-02 19:39:54 +07:00
Gravit
fb7ac48962 FileServerHandler использование 2018-10-02 19:29:47 +07:00
Gravit
111ebd2f19 FileServerHandler update 2018-10-02 19:20:57 +07:00
Gravit
275305b16c LauncherUpdateResponse реализация 2018-10-02 19:19:57 +07:00
Gravit
2024018eb2 Move ServerWrapper.cfg 2018-10-02 18:36:01 +07:00
zaxar163
bc6313b546 Some improvements in FileDownloader (control of request params). 2018-10-01 19:48:29 +03:00
Zaxar163
fccd793168 Fix filedownloader. (#28) 2018-10-01 15:00:22 +03:00
Gravit
e133fc06cb LauncherUpdateResponse 2018-10-01 18:15:39 +07:00
Gravit
3fe1cdde60 checkServer and joinServer 2018-10-01 17:39:35 +07:00
Gravit
79acc5b503 Привилегии 2018-10-01 17:08:16 +07:00
Gravit
b60bdb72fa События 2018-10-01 17:01:10 +07:00
Gravit
bf061bfaf2 Сохранение данных в сессии 2018-10-01 16:43:41 +07:00
Gravit
6f16819cad AuthResponse fix 2018-10-01 16:07:11 +07:00
Gravit
a32402f1a6 Правильная инициализация WebSocketService 2018-10-01 15:58:07 +07:00
Gravit
b76e009aaa SimpleResponse 2018-10-01 15:36:19 +07:00
Gravit
df0d9f37a2 SuccessResult 2018-10-01 15:16:48 +07:00
Gravit
3daabe584f WebSocketService использование 2018-10-01 15:11:56 +07:00
Gravit
b42d3d6a08 WebSocketService 2018-10-01 15:08:21 +07:00
Gravit
a1bb6d6e2f Фикс отправления ответов 2018-10-01 14:55:09 +07:00
Gravit
7f952af1b9 writeAndFlush 2018-10-01 14:48:53 +07:00
Gravit
fdb7da1460 Тестовый AuthResponse 2018-10-01 14:48:24 +07:00
Gravit
5fa271314c Тестовый EchoResponse 2018-10-01 14:06:56 +07:00
Gravit
3dfde49ac9 WebSocket json 2018-10-01 13:45:36 +07:00
Zaxar163
e4b0c1c646 Add websocket on client. (#27)
* Add websocket on client.

* Make send methods.
2018-09-30 18:42:07 +07:00
Gravit
0421ffd65a Исправление конфига ProGuard 2018-09-30 18:29:14 +07:00
Gravit
b6d0692a1e Исправление фикса для 1.12 2018-09-29 14:18:31 +07:00
Gravit
a8bdebd767 Обновление стандартных конфигов 2018-09-29 13:34:29 +07:00
Gravit
fc6e191ddf Фикс отсутствия краша Java при обнаружении модификации клиента 2018-09-29 13:31:29 +07:00
Gravit
dab963a2eb Исправление title при AuthServerRequest 2018-09-27 05:00:46 +07:00
Gravit
f7bd4a5941 Исправления формата ответа и реализация в ServerWrapper 2018-09-27 04:46:59 +07:00
Gravit
20cb561b3e Исключения при сборке мусора для серверов и обязательная авторизация сервера 2018-09-27 04:30:43 +07:00
Gravit
e77a848843 Авторизация сервера 2018-09-27 04:18:26 +07:00
Zaxar163
b77e22ce9f Fileserver (#26)
* FileServer

* FileServer output modified.

* Update FileInitializer.java
2018-09-27 12:47:48 +07:00
Zaxar163
5cc0d86492 Сritical fix. (#24) 2018-09-26 18:44:46 +03:00
Zaxar163
a5ff883ed4 Gradle fix (#23)
* Update build.gradle

* Update build.gradle
2018-09-26 22:08:48 +07:00
Zaxar163
3f2174689a Filedownloader (#22)
* Added downloader runnable.

* Added thread downloader.

* Small fix.

* Optimize downloading.

* Remove program stop.
2018-09-26 22:00:53 +07:00
Gravit
e4b8cf59bf Фикс config.bin not found в ServerWrapper 2018-09-26 15:54:14 +07:00
Gravit
e44264d554 Authlib 2018-09-25 21:06:13 +07:00
Gravit
b71df6ca01 Интеграция с сервером 2018-09-25 20:43:12 +07:00
Gravit
f83afcd8e1 LauncherAPI/ServerWrapper модуль 2018-09-25 20:33:26 +07:00
Gravit
c856d351f1 Вернул sUsingWrapper true 2018-09-25 19:16:45 +07:00
Gravit
4ef4df0911 Опциональные моды реализованы 2018-09-25 19:05:20 +07:00
Gravit
b32a613fd5 Опциональные моды начало фикса 2018-09-25 00:41:00 +07:00
Gravit
77978b0f74 Опциональные моды 2018-09-24 23:34:06 +07:00
Gravit
6df0863f1e Ошибка вместо краша при CheckServerRequest
Для полноценного исправления проблемы на Forge/Sponge 1.12 ужно заменить launchwrapper на патченый
2018-09-24 21:55:03 +07:00
772 changed files with 33886 additions and 19298 deletions

86
.gitattributes vendored
View file

@ -1,26 +1,78 @@
* text eol=lf
*.bat text eol=crlf
*.sh text eol=lf
* text=auto eol=lf
*.[cC][mM][dD] text eol=crlf
*.[bB][aA][tT] text eol=crlf
*.[pP][sS]1 text eol=crlf
*.[sS][hH] text eol=lf
*.patch text eol=lf
*.java text eol=lf
*.scala text eol=lf
*.groovy text eol=lf
*.gradle text eol=crlf
gradle.properties text eol=crlf
/gradle/wrapper/gradle-wrapper.properties text eol=crlf
*.cfg text eol=lf
*.png binary
*.jar binary
*.war binary
*.lzma binary
*.zip binary
*.gzip binary
*.dll binary
*.so binary
*.exe binary
*.ico binary
*.eot binary
*.ttf binary
*.woff binary
*.woff2 binary
*.a binary
*.lib binary
*.icns binary
*.jpg binary
*.jpeg binary
*.gif binary
*.mov binary
*.mp4 binary
*.mp3 binary
*.flv binary
*.fla binary
*.swf binary
*.gz binary
*.tar binary
*.tar.gz binary
*.7z binary
*.pyc binary
*.gpg binary
*.bin binary
*.gitattributes text eol=crlf
*.gitignore text eol=crlf
*.gitattributes text
.gitignore text
# Java sources
*.java text diff=java
*.kt text diff=kotlin
*.groovy text diff=java
*.scala text diff=java
*.gradle text diff=java
*.gradle.kts text diff=kotlin
# These files are text and should be normalized (Convert crlf => lf)
*.css text diff=css
*.scss text diff=css
*.sass text
*.df text
*.htm text diff=html
*.html text diff=html
*.js text
*.jsp text
*.jspf text
*.jspx text
*.properties text
*.tld text
*.tag text
*.tagx text
*.xml text
# These files are binary and should be left untouched
# (binary is a macro for -text -diff)
*.class binary
*.dll binary
*.ear binary
*.jar binary
*.so binary
*.war binary
*.jks binary
mvnw text eol=lf
gradlew text eol=lf

83
.github/workflows/push.yml vendored Normal file
View file

@ -0,0 +1,83 @@
name: push
on: push
jobs:
launcher:
name: Launcher
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Cache Gradle
uses: actions/cache@v4
with:
path: ~/.gradle/caches
key: gravit-${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}-launcher
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: 21
distribution: temurin
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@417ae3ccd767c252f5661f1ace9f835f9654f2b5
- name: Create artifacts
run: |
mkdir -p artifacts/modules
cd LaunchServer/build/libs
mv proguard proguard-libraries
zip -r -9 ../../../artifacts/libraries.zip * -x "LaunchServer.jar" -x "LaunchServer-clean.jar"
cp LaunchServer.jar ../../../artifacts/LaunchServer.jar
cd ../../..
cp ServerWrapper/build/libs/ServerWrapper.jar artifacts/ServerWrapper.jar
cp ServerWrapper/build/libs/ServerWrapper-inline.jar artifacts/ServerWrapperInline.jar
cp LauncherAuthlib/build/libs/LauncherAuthlib.jar artifacts/LauncherAuthlib.jar || true
cp modules/*_module/build/libs/*.jar artifacts/modules || true
cp modules/*_lmodule/build/libs/*.jar artifacts/modules || true
cp javaargs.txt artifacts/javaargs.txt || true
cp java24args.txt artifacts/java24args.txt || true
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: Launcher
path: artifacts
- name: Get version value, set to env
if: startsWith(github.event.ref, 'refs/tags')
run: echo "LAUNCHER_VERSION=$(echo ${{ github.event.ref }} | awk -F\/ '{print $3}')" >> $GITHUB_ENV
- name: Prebuild release files
if: startsWith(github.event.ref, 'refs/tags')
run: |
cd artifacts
zip -r -9 Release.zip *
zip -j -9 LaunchServerModules.zip ../modules/*_module/build/libs/*.jar
zip -j -9 LauncherModules.zip ../modules/*_lmodule/build/libs/*.jar
cd ../LaunchServer/build/libs
zip -r -9 ../../../artifacts/LauncherBase.zip * -x "LaunchServer-clean.jar"
- name: Create release
id: create_release
uses: softprops/action-gh-release@v2
if: startsWith(github.event.ref, 'refs/tags')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Список настроек тута: https://github.com/softprops/action-gh-release#-customizing
# Можно сделать пуш описания релиза из файла
with:
name: GravitLauncher ${{ env.LAUNCHER_VERSION }}
draft: false
prerelease: false
files: |
artifacts/*

3
.gitignore vendored
View file

@ -107,3 +107,6 @@ buildnumber
*.directory
cmd.bat
cmd.sh
project/target
## PVS Studio
.PVS-Studio/

2
.gitmodules vendored
View file

@ -1,3 +1,3 @@
[submodule "modules"]
path = modules
url = git@github.com:GravitLauncher/LauncherModules.git
url = https://github.com/GravitLauncher/LauncherModules.git

View file

@ -1,23 +0,0 @@
# project is java
language: java
# Use https (public access) instead of git for git-submodules. This modifies only Travis-CI behavior!
# disable the default submodule logic
git:
submodules: false
# use sed to replace the SSH URL with the public URL, then init and update submodules
before_install:
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive
# gradle
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
script:
- ./gradlew assemble build
# not working artifacts
addons:
artifacts: false

47
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,47 @@
# GravitLauncher GitConvention #
Цель конвенции — внедрить простые, прозрачные и эффективные правила работы с Git.
Разработка GravitLauncher идёт на базе [Git Flow](https://leanpub.com/git-flow/read). Подробности ниже.
## Ветвление ##
| Название ветки | Значение ветки | Исходная ветка | Пример ветки |
| ------------- | ------------- | ------------- | ------------- |
| **master** | Полностью готовая для production-а | **release** | |
| **develop** | Разработка нового функционала | **master** | |
| **release** | Тестирование всего нового функционала | **develop** | |
| | | | |
| **bugfix-*** | Исправляет баг нового функционала | **release** | *bugfix-auth* |
| **feature-*** | Добавляет новую возможность | **develop** | *feature-auth* |
| **hotfix-*** | Вносит срочное исправление для production-а | **master** | *hotfix-auth* |
-----
![Image of GitFlow](https://i.ytimg.com/vi/w2r0oLFtXAw/maxresdefault.jpg)
-----
## Коммиты ##
**Основные правила:**
1. Все коммиты должны быть на английском языке.
2. Запрещено использовать прошедшее время.
3. Обязательно должен быть использован префикс.
4. В конце не должно быть лишнего знака препинания.
5. Длина любой части не должна превышать 100 символов.
**Структура:**
```
[Префикс] <Сообщение>
```
| Префикс | Значение | Пример |
| ------- | -------- | ------ |
| **[FIX]** | Всё, что касается исправления багов | [FIX] Bug with failed authorization |
| **[DOCS]** | Всё, что касается документации | [DOCS] Documenting Authorization API |
| **[FEATURE]** | Всё, что касается новых возможностей | [FEATURE] 2FA on authorization |
| **[STYLE]** | Всё, что касается опечаток и форматирования | [STYLE] Typos in the authorization module |
| **[REFACTOR]** | Всё, что касается рефакторинга | [REFACTOR] Switching to EDA in the authorization module |
| **[TEST]** | Всё, что касается тестирования | [TEST] Coverage of the authorization module with tests |
| **[ANY]** | Всё, что не подходит к предыдущему. | [ANY] Connecting Travis CI |

12
Dockerfile Normal file
View file

@ -0,0 +1,12 @@
FROM ubuntu:latest
RUN apt-get update && apt-get install -y osslsigncode openjdk-11-jdk unzip jq screen
ADD https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_linux-x64_bin-jmods.zip .
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
RUN mkdir ./libraries ./launcher-libraries ./launcher-libraries-compile ./compat ./compat/modules
COPY ./LaunchServer/build/libs/LaunchServer.jar .
COPY ./LaunchServer/build/libs/libraries ./libraries
COPY ./LaunchServer/build/libs/launcher-libraries ./launcher-libraries
COPY ./LaunchServer/build/libs/launcher-libraries-compile ./launcher-libraries-compile
COPY ./compat/authlib/authlib-clean.jar ./LauncherAuthlib/build/libs/* ./ServerWrapper/build/libs/ServerWrapper.jar ./compat/
COPY ./modules/*_module/build/libs/* ./modules/*_lmodule/build/libs/* ./compat/modules/
CMD screen -DmS launchserver java -javaagent:LaunchServer.jar -jar LaunchServer.jar

View file

@ -1,86 +1,199 @@
def mainClassName = "ru.gravit.launchserver.LaunchServer"
def mainAgentName = "ru.gravit.launchserver.StarterAgent"
def mainClassName = "pro.gravit.launchserver.Main"
def mainAgentName = "pro.gravit.launchserver.StarterAgent"
evaluationDependsOn(':Launcher')
repositories {
maven {
url "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
}
maven {
url "http://maven.geomajas.org/"
}
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
maven {
url "http://repo.md-5.net/content/groups/public"
url "https://jcenter.bintray.com/"
}
maven {
url "https://jitpack.io/"
}
maven {
url 'https://maven.gravit-support.ru/repository/jitpack'
credentials {
username = 'gravitlauncher'
password = 'gravitlauncher'
}
}
}
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
sourceCompatibility = '21'
targetCompatibility = '21'
configurations {
bundleOnly
bundle
hikari
bundle.extendsFrom bundleOnly
compileOnly.extendsFrom bundle, hikari
pack
proguardPack
bundleOnly.extendsFrom bundle
api.extendsFrom bundle, pack
}
jar {
dependsOn parent.childProjects.Launcher.tasks.build, parent.childProjects.Launcher.tasks.genRuntimeJS, parent.childProjects.Launcher.tasks.jar
from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
from(parent.childProjects.Launcher.tasks.jar.archivePath, parent.childProjects.Launcher.tasks.genRuntimeJS.archivePath)
dependsOn parent.childProjects.Launcher.tasks.assemble
from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } }
exclude("module-info.class")
from(parent.childProjects.Launcher.tasks.shadowJar)
from(parent.childProjects.Launcher.tasks.genRuntimeJS)
manifest.attributes("Main-Class": mainClassName,
"Premain-Class": mainAgentName,
"Can-Redefine-Classes": "true",
"Can-Retransform-Classes": "true",
"Can-Set-Native-Method-Prefix": "true"
"Multi-Release": "true",
"Automatic-Module-Name": "launchserver"
)
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
tasks.register('sourcesJar', Jar) {
from sourceSets.main.allJava
archiveClassifier.set('sources')
}
tasks.register('javadocJar', Jar) {
from javadoc
archiveClassifier.set('javadoc')
}
tasks.register('cleanjar', Jar) {
dependsOn jar
archiveClassifier.set('clean')
manifest.attributes("Main-Class": mainClassName,
"Automatic-Module-Name": "launchserver"
)
from sourceSets.main.output
}
dependencies {
compile project(':libLauncher') // pack
compileOnly 'org.spigotmc:spigot-api:1.8-R0.1-SNAPSHOT' // api
compileOnly 'net.md-5:bungeecord-api:1.8-SNAPSHOT' // api
compileOnly 'org.ow2.asm:asm-debug-all:5.0.4'
bundleOnly 'org.ow2.asm:asm-all:5.0.4'
bundle 'org.apache.logging.log4j:log4j-core:2.9.0'
bundle 'mysql:mysql-connector-java:8.0.12'
bundle 'jline:jline:2.14.6'
bundle 'net.sf.proguard:proguard-base:6.0.3'
bundle 'org.bouncycastle:bcpkix-jdk15on:1.49'
bundle 'org.fusesource.jansi:jansi:1.17.1'
bundle 'commons-io:commons-io:2.6'
bundle 'org.javassist:javassist:3.23.1-GA'
bundle 'io.netty:netty-all:4.1.28.Final'
pack(project(':LauncherAPI')) {
exclude group: "com.google.code.gson"
}
bundle group: 'com.google.code.gson', name: 'gson', version: rootProject['verGson']
bundle group: 'me.tongfei', name: 'progressbar', version: '0.10.1'
bundle group: 'org.fusesource.jansi', name: 'jansi', version: rootProject['verJansi']
bundle group: 'org.jline', name: 'jline-native', version: rootProject['verJline']
bundle group: 'org.jline', name: 'jline-reader', version: rootProject['verJline']
bundle group: 'org.jline', name: 'jline-terminal-ffm', version: rootProject['verJline']
bundle group: 'org.bouncycastle', name: 'bcprov-jdk18on', version: rootProject['verBcpkix']
bundle group: 'org.bouncycastle', name: 'bcpkix-jdk18on', version: rootProject['verBcpkix']
bundle group: 'org.ow2.asm', name: 'asm-commons', version: rootProject['verAsm']
bundle group: 'io.netty', name: 'netty-codec-http', version: rootProject['verNetty']
bundle group: 'io.netty', name: 'netty-transport-classes-epoll', version: rootProject['verNetty']
bundle group: 'io.netty', name: 'netty-transport-native-epoll', version: rootProject['verNetty'], classifier: 'linux-x86_64'
//bundle group: 'io.netty', name: 'netty-transport-native-epoll', version: rootProject['verNetty'], classifier: 'linux-aarch_64'
bundle group: 'io.netty', name: 'netty-transport-classes-io_uring', version: rootProject['verNetty']
bundle group: 'io.netty', name: 'netty-transport-native-io_uring', version: rootProject['verNetty'], classifier: 'linux-x86_64'
//bundle group: 'io.netty', name: 'netty-transport-native-io_uring', version: rootProject['verNetty'], classifier: 'linux-aarch_64'
// Netty
bundle 'org.jboss.marshalling:jboss-marshalling:1.4.11.Final'
bundle 'com.google.protobuf.nano:protobuf-javanano:3.1.0'
//
bundle group: 'org.slf4j', name: 'slf4j-api', version: rootProject['verSlf4j']
bundle group: 'com.mysql', name: 'mysql-connector-j', version: rootProject['verMySQLConn']
bundle group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: rootProject['verMariaDBConn']
bundle group: 'org.postgresql', name: 'postgresql', version: rootProject['verPostgreSQLConn']
bundle group: 'com.h2database', name: 'h2', version: rootProject['verH2Conn']
proguardPack group: 'com.guardsquare', name: 'proguard-base', version: rootProject['verProguard']
bundle group: 'org.apache.logging.log4j', name: 'log4j-core', version: rootProject['verLog4j']
bundle group: 'org.apache.logging.log4j', name: 'log4j-slf4j2-impl', version: rootProject['verLog4j']
bundle group: 'io.jsonwebtoken', name: 'jjwt-api', version: rootProject['verJwt']
bundle group: 'io.jsonwebtoken', name: 'jjwt-impl', version: rootProject['verJwt']
bundle group: 'io.jsonwebtoken', name: 'jjwt-gson', version: rootProject['verJwt']
bundle group: 'com.google.code.gson', name: 'gson', version: rootProject['verGson']
annotationProcessor(group: 'org.apache.logging.log4j', name: 'log4j-core', version: rootProject['verLog4j'])
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: rootProject['verJunit']
bundle 'org.slf4j:slf4j-simple:1.7.25'
bundle 'org.slf4j:slf4j-api:1.7.25'
hikari 'io.micrometer:micrometer-core:1.0.6'
hikari('hikari-cp:hikari-cp:2.6.0') {
bundle 'io.micrometer:micrometer-core:1.14.4'
bundle('com.zaxxer:HikariCP:6.2.1') {
exclude group: 'javassist'
exclude group: 'io.micrometer'
exclude group: 'org.slf4j'
}
}
compileOnly('net.sf.launch4j:launch4j:3.12') { // need user
exclude group: '*'
tasks.register('dumpLibs', Copy) {
duplicatesStrategy = 'EXCLUDE'
into "$buildDir/libs/libraries"
from configurations.bundleOnly
}
tasks.register('dumpProguard', Copy) {
duplicatesStrategy = 'EXCLUDE'
into "$buildDir/libs/proguard"
from configurations.proguardPack
}
tasks.register('bundle', Zip) {
duplicatesStrategy = 'EXCLUDE'
dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.jar
archiveFileName = 'LaunchServer.zip'
destinationDirectory = file("$buildDir")
from(tasks.dumpLibs.destinationDir) { into 'libraries' }
from(tasks.jar)
from(parent.childProjects.Launcher.tasks.dumpLibs) { into 'launcher-libraries' }
}
tasks.register('dumpClientLibs', Copy) {
dependsOn parent.childProjects.Launcher.tasks.build
into "$buildDir/libs/launcher-libraries"
from parent.childProjects.Launcher.tasks.dumpLibs
}
assemble.dependsOn tasks.dumpLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar, tasks.dumpProguard
publishing {
publications {
launchserverapi(MavenPublication) {
artifactId = 'launchserver-api'
artifact(cleanjar) {
classifier ""
}
artifact sourcesJar
artifact javadocJar
pom {
name = 'GravitLauncher LaunchServer API'
description = 'GravitLauncher LaunchServer Module API'
url = 'https://gravitlauncher.com'
licenses {
license {
name = 'GNU General Public License, Version 3.0'
url = 'https://www.gnu.org/licenses/gpl-3.0.html'
}
}
developers {
developer {
id = 'gravita'
name = 'Gravita'
email = 'gravita@gravit.pro'
}
developer {
id = 'zaxar163'
name = 'Zaxar163'
email = 'zahar.vcherachny@yandex.ru'
}
}
//compile 'org.mozilla:rhino:1.7.10' will be module
scm {
connection = 'scm:git:https://github.com/GravitLauncher/Launcher.git'
developerConnection = 'scm:git:ssh://git@github.com:GravitLauncher/Launcher.git'
url = 'https://gravitlauncher.com/'
}
}
}
}
}
task hikari(type: Copy) {
into "$buildDir/libs/libraries/hikaricp"
from configurations.hikari
signing {
sign publishing.publications.launchserverapi
}
task dumpLibs(type: Copy) {
dependsOn tasks.hikari
into "$buildDir/libs/libraries"
from configurations.bundle
}
build.dependsOn tasks.dumpLibs

View file

@ -0,0 +1,106 @@
package pro.gravit.launchserver;
import com.google.gson.JsonElement;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launchserver.helper.HttpHelper;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.time.Duration;
public class HttpRequester {
private transient final HttpClient httpClient = HttpClient.newBuilder().build();
public HttpRequester() {
}
public <T> SimpleErrorHandler<T> makeEH(Class<T> clazz) {
return new SimpleErrorHandler<>(clazz);
}
public <T> SimpleErrorHandler<T> makeEH(Type clazz) {
return new SimpleErrorHandler<>(clazz);
}
public <T> HttpRequest get(String url, String token) {
try {
var requestBuilder = HttpRequest.newBuilder()
.method("GET", HttpRequest.BodyPublishers.noBody())
.uri(new URI(url))
.header("Content-Type", "application/json; charset=UTF-8")
.header("Accept", "application/json")
.timeout(Duration.ofMillis(10000));
if (token != null) {
requestBuilder.header("Authorization", "Bearer ".concat(token));
}
return requestBuilder.build();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public <T> HttpRequest post(String url, T request, String token) {
try {
var requestBuilder = HttpRequest.newBuilder()
.method("POST", HttpRequest.BodyPublishers.ofString(Launcher.gsonManager.gson.toJson(request)))
.uri(new URI(url))
.header("Content-Type", "application/json; charset=UTF-8")
.header("Accept", "application/json")
.timeout(Duration.ofMillis(10000));
if (token != null) {
requestBuilder.header("Authorization", "Bearer ".concat(token));
}
return requestBuilder.build();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public <T> HttpHelper.HttpOptional<T, SimpleError> send(HttpRequest request, Class<T> clazz) throws IOException {
return HttpHelper.send(httpClient, request, makeEH(clazz));
}
public <T> HttpHelper.HttpOptional<T, SimpleError> send(HttpRequest request, Type type) throws IOException {
return HttpHelper.send(httpClient, request, makeEH(type));
}
public static class SimpleErrorHandler<T> implements HttpHelper.HttpJsonErrorHandler<T, SimpleError> {
private final Type type;
private SimpleErrorHandler(Type type) {
this.type = type;
}
@Override
public HttpHelper.HttpOptional<T, SimpleError> applyJson(JsonElement response, int statusCode) {
if (statusCode < 200 || statusCode >= 300) {
return new HttpHelper.HttpOptional<>(null, Launcher.gsonManager.gson.fromJson(response, SimpleError.class), statusCode);
}
if (type == Void.class) {
return new HttpHelper.HttpOptional<>(null, null, statusCode);
}
return new HttpHelper.HttpOptional<>(Launcher.gsonManager.gson.fromJson(response, type), null, statusCode);
}
}
public static class SimpleError {
public String error;
public int code;
public SimpleError(String error) {
this.error = error;
}
@Override
public String toString() {
return "SimpleError{" +
"error='" + error + '\'' +
", code=" + code +
'}';
}
}
}

View file

@ -0,0 +1,508 @@
package pro.gravit.launchserver;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.events.RequestEvent;
import pro.gravit.launcher.base.events.request.ProfilesRequestEvent;
import pro.gravit.launcher.base.modules.events.ClosePhase;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.core.RejectAuthCoreProvider;
import pro.gravit.launchserver.binary.EXELauncherBinary;
import pro.gravit.launchserver.binary.JARLauncherBinary;
import pro.gravit.launchserver.binary.LauncherBinary;
import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.helper.SignHelper;
import pro.gravit.launchserver.launchermodules.LauncherModuleLoader;
import pro.gravit.launchserver.manangers.*;
import pro.gravit.launchserver.manangers.hook.AuthHookManager;
import pro.gravit.launchserver.modules.events.*;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.SocketCommandServer;
import pro.gravit.launchserver.socket.handlers.NettyServerSocketHandler;
import pro.gravit.launchserver.socket.response.auth.RestoreResponse;
import pro.gravit.utils.command.Command;
import pro.gravit.utils.command.CommandHandler;
import pro.gravit.utils.command.SubCommand;
import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.nio.file.*;
import java.security.KeyStore;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* The main LaunchServer class. Contains links to all necessary objects
* Not a singletron
*/
public final class LaunchServer implements Runnable, AutoCloseable, Reconfigurable {
/**
* Working folder path
*/
public final Path dir;
/**
* Environment type (test / production)
*/
public final LaunchServerEnv env;
/**
* The path to the folder with libraries for the launcher
*/
public final Path launcherLibraries;
/**
* The path to the folder with compile-only libraries for the launcher
*/
public final Path launcherLibrariesCompile;
public final Path launcherPack;
/**
* The path to the folder with updates/webroot
*/
@Deprecated
public final Path updatesDir;
// Constant paths
/**
* Save/Reload LaunchServer config
*/
public final LaunchServerConfigManager launchServerConfigManager;
/**
* The path to the folder with profiles
*/
public final Path tmpDir;
public final Path modulesDir;
public final Path launcherModulesDir;
public final Path librariesDir;
public final Path controlFile;
public final Path proguardDir;
/**
* This object contains runtime configuration
*/
public final LaunchServerRuntimeConfig runtime;
/**
* Pipeline for building JAR
*/
public final JARLauncherBinary launcherBinary;
/**
* Pipeline for building EXE
*/
public final LauncherBinary launcherEXEBinary;
// Server config
public final AuthHookManager authHookManager;
public final LaunchServerModulesManager modulesManager;
// Launcher binary
public final MirrorManager mirrorManager;
public final AuthManager authManager;
public final ReconfigurableManager reconfigurableManager;
public final ConfigManager configManager;
public final FeaturesManager featuresManager;
public final KeyAgreementManager keyAgreementManager;
public final UpdatesManager updatesManager;
// HWID ban + anti-brutforce
public final CertificateManager certificateManager;
// Server
public final CommandHandler commandHandler;
public final NettyServerSocketHandler nettyServerSocketHandler;
public final SocketCommandServer socketCommandServer;
public final ScheduledExecutorService service;
public final AtomicBoolean started = new AtomicBoolean(false);
public final LauncherModuleLoader launcherModuleLoader;
private final Logger logger = LogManager.getLogger();
public final int shardId;
public LaunchServerConfig config;
public LaunchServer(LaunchServerDirectories directories, LaunchServerEnv env, LaunchServerConfig config, LaunchServerRuntimeConfig runtimeConfig, LaunchServerConfigManager launchServerConfigManager, LaunchServerModulesManager modulesManager, KeyAgreementManager keyAgreementManager, CommandHandler commandHandler, CertificateManager certificateManager, int shardId) throws IOException {
this.dir = directories.dir;
this.tmpDir = directories.tmpDir;
this.env = env;
this.config = config;
this.launchServerConfigManager = launchServerConfigManager;
this.modulesManager = modulesManager;
this.updatesDir = directories.updatesDir;
this.keyAgreementManager = keyAgreementManager;
this.commandHandler = commandHandler;
this.runtime = runtimeConfig;
this.certificateManager = certificateManager;
this.service = Executors.newScheduledThreadPool(config.netty.performance.schedulerThread);
launcherLibraries = directories.launcherLibrariesDir;
launcherLibrariesCompile = directories.launcherLibrariesCompileDir;
launcherPack = directories.launcherPackDir;
modulesDir = directories.modules;
launcherModulesDir = directories.launcherModules;
librariesDir = directories.librariesDir;
controlFile = directories.controlFile;
proguardDir = directories.proguardDir;
this.shardId = shardId;
if(!Files.isDirectory(launcherPack)) {
Files.createDirectories(launcherPack);
}
config.setLaunchServer(this);
modulesManager.invokeEvent(new NewLaunchServerInstanceEvent(this));
// Print keypair fingerprints
runtime.verify();
config.verify();
// build hooks, anti-brutforce and other
mirrorManager = new MirrorManager();
reconfigurableManager = new ReconfigurableManager();
authHookManager = new AuthHookManager();
configManager = new ConfigManager();
featuresManager = new FeaturesManager(this);
authManager = new AuthManager(this);
updatesManager = new UpdatesManager(this);
RestoreResponse.registerProviders(this);
config.init(ReloadType.FULL);
registerObject("launchServer", this);
pro.gravit.launchserver.command.handler.CommandHandler.registerCommands(commandHandler, this);
// init modules
modulesManager.invokeEvent(new LaunchServerInitPhase(this));
// Set launcher EXE binary
launcherBinary = new JARLauncherBinary(this);
launcherEXEBinary = binary();
launcherBinary.init();
launcherEXEBinary.init();
syncLauncherBinaries();
launcherModuleLoader = new LauncherModuleLoader(this);
if (config.components != null) {
logger.debug("Init components");
config.components.forEach((k, v) -> {
logger.debug("Init component {}", k);
v.setComponentName(k);
v.init(this);
});
logger.debug("Init components successful");
}
launcherModuleLoader.init();
nettyServerSocketHandler = new NettyServerSocketHandler(this);
socketCommandServer = new SocketCommandServer(commandHandler, controlFile);
if(config.sign.checkCertificateExpired) {
checkCertificateExpired();
service.scheduleAtFixedRate(this::checkCertificateExpired, 24, 24, TimeUnit.HOURS);
}
// post init modules
modulesManager.invokeEvent(new LaunchServerPostInitPhase(this));
}
public void reload(ReloadType type) throws Exception {
config.close(type);
Map<String, AuthProviderPair> pairs = null;
if (type.equals(ReloadType.NO_AUTH)) {
pairs = config.auth;
}
logger.info("Reading LaunchServer config file");
config = launchServerConfigManager.readConfig();
config.setLaunchServer(this);
if (type.equals(ReloadType.NO_AUTH)) {
config.auth = pairs;
}
config.verify();
config.init(type);
if (type.equals(ReloadType.FULL) && config.components != null) {
logger.debug("Init components");
config.components.forEach((k, v) -> {
logger.debug("Init component {}", k);
v.setComponentName(k);
v.init(this);
});
logger.debug("Init components successful");
}
if(!type.equals(ReloadType.NO_AUTH)) {
nettyServerSocketHandler.nettyServer.service.forEachActiveChannels((channel, wsHandler) -> {
Client client = wsHandler.getClient();
if(client.auth != null) {
client.auth = config.getAuthProviderPair(client.auth_id);
}
});
}
}
@Override
public Map<String, Command> getCommands() {
Map<String, Command> commands = new HashMap<>();
SubCommand reload = new SubCommand("[type]", "reload launchserver config") {
@Override
public void invoke(String... args) throws Exception {
if (args.length == 0) {
reload(ReloadType.FULL);
return;
}
switch (args[0]) {
case "full" -> reload(ReloadType.FULL);
case "no_components" -> reload(ReloadType.NO_COMPONENTS);
default -> reload(ReloadType.NO_AUTH);
}
}
};
commands.put("reload", reload);
SubCommand save = new SubCommand("[]", "save launchserver config") {
@Override
public void invoke(String... args) throws Exception {
launchServerConfigManager.writeConfig(config);
launchServerConfigManager.writeRuntimeConfig(runtime);
logger.info("LaunchServerConfig saved");
}
};
commands.put("save", save);
LaunchServer instance = this;
SubCommand resetauth = new SubCommand("authId", "reset auth by id") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
AuthProviderPair pair = config.getAuthProviderPair(args[0]);
if (pair == null) {
logger.error("Pair not found");
return;
}
pair.core.close();
pair.core = new RejectAuthCoreProvider();
pair.core.init(instance, pair);
}
};
commands.put("resetauth", resetauth);
return commands;
}
public void checkCertificateExpired() {
if(!config.sign.enabled) {
return;
}
try {
KeyStore keyStore = SignHelper.getStore(Paths.get(config.sign.keyStore), config.sign.keyStorePass, config.sign.keyStoreType);
Instant date = SignHelper.getCertificateExpired(keyStore, config.sign.keyAlias);
if(date == null) {
logger.debug("The certificate will expire at unlimited");
} else if(date.minus(Duration.ofDays(30)).isBefore(Instant.now())) {
logger.warn("The certificate will expire at {}", date.toString());
} else {
logger.debug("The certificate will expire at {}", date.toString());
}
} catch (Throwable e) {
logger.error("Can't get certificate expire date", e);
}
}
private LauncherBinary binary() {
LaunchServerLauncherExeInit event = new LaunchServerLauncherExeInit(this, null);
modulesManager.invokeEvent(event);
if(event.binary != null) {
return event.binary;
}
return new EXELauncherBinary(this);
}
public void buildLauncherBinaries() throws IOException {
launcherBinary.build();
launcherEXEBinary.build();
}
public void close() throws Exception {
service.shutdownNow();
logger.info("Close server socket");
nettyServerSocketHandler.close();
// Close handlers & providers
config.close(ReloadType.FULL);
modulesManager.invokeEvent(new ClosePhase());
logger.info("Save LaunchServer runtime config");
launchServerConfigManager.writeRuntimeConfig(runtime);
// Print last message before death :(
logger.info("LaunchServer stopped");
}
@Deprecated
public Set<ClientProfile> getProfiles() {
return config.profileProvider.getProfiles();
}
@Deprecated
public void setProfiles(Set<ClientProfile> profilesList) {
throw new UnsupportedOperationException();
}
public void rebindNettyServerSocket() {
nettyServerSocketHandler.close();
CommonHelper.newThread("Netty Server Socket Thread", false, nettyServerSocketHandler).start();
}
@Override
public void run() {
if (started.getAndSet(true))
throw new IllegalStateException("LaunchServer has been already started");
// Add shutdown hook, then start LaunchServer
if (!this.env.equals(LaunchServerEnv.TEST)) {
JVMHelper.RUNTIME.addShutdownHook(CommonHelper.newThread(null, false, () -> {
try {
close();
} catch (Exception e) {
logger.error("LaunchServer close error", e);
}
}));
CommonHelper.newThread("Command Thread", true, commandHandler).start();
CommonHelper.newThread("Socket Command Thread", true, socketCommandServer).start();
// Sync updates dir
CommonHelper.newThread("Profiles and updates sync", true, () -> {
try {
// Sync profiles dir
syncProfilesDir();
// Sync updates dir
config.updatesProvider.syncInitially();
modulesManager.invokeEvent(new LaunchServerProfilesSyncEvent(this));
} catch (IOException e) {
logger.error("Updates/Profiles not synced", e);
}
}).start();
}
if (config.netty != null)
rebindNettyServerSocket();
try {
modulesManager.fullInitializedLaunchServer(this);
modulesManager.invokeEvent(new LaunchServerFullInitEvent(this));
logger.info("LaunchServer started");
} catch (Throwable e) {
logger.error("LaunchServer startup failed", e);
JVMHelper.RUNTIME.exit(-1);
}
}
public void syncLauncherBinaries() throws IOException {
logger.info("Syncing launcher binaries");
// Syncing launcher binary
logger.info("Syncing launcher binary file");
if (!launcherBinary.sync()) logger.warn("Missing launcher binary file");
// Syncing launcher EXE binary
logger.info("Syncing launcher EXE binary file");
if (!launcherEXEBinary.sync())
logger.warn("Missing launcher EXE binary file");
}
public void syncProfilesDir() throws IOException {
logger.info("Syncing profiles dir");
config.profileProvider.sync();
if (config.netty.sendProfileUpdatesEvent) {
sendUpdateProfilesEvent();
}
}
private void sendUpdateProfilesEvent() {
if (nettyServerSocketHandler == null || nettyServerSocketHandler.nettyServer == null || nettyServerSocketHandler.nettyServer.service == null) {
return;
}
nettyServerSocketHandler.nettyServer.service.forEachActiveChannels((ch, handler) -> {
Client client = handler.getClient();
if (client == null || !client.isAuth) {
return;
}
ProfilesRequestEvent event = new ProfilesRequestEvent(config.profileProvider.getProfiles(client));
event.requestUUID = RequestEvent.eventUUID;
handler.service.sendObject(ch, event);
});
}
public void syncUpdatesDir(Collection<String> dirs) throws IOException {
updatesManager.syncUpdatesDir(dirs);
}
public void registerObject(String name, Object object) {
if (object instanceof Reconfigurable) {
reconfigurableManager.registerReconfigurable(name, (Reconfigurable) object);
}
}
public void unregisterObject(String name, Object object) {
if (object instanceof Reconfigurable) {
reconfigurableManager.unregisterReconfigurable(name);
}
}
public enum ReloadType {
NO_AUTH,
NO_COMPONENTS,
FULL
}
public enum LaunchServerEnv {
TEST,
DEV,
DEBUG,
PRODUCTION
}
public interface LaunchServerConfigManager {
LaunchServerConfig readConfig() throws IOException;
LaunchServerRuntimeConfig readRuntimeConfig() throws IOException;
void writeConfig(LaunchServerConfig config) throws IOException;
void writeRuntimeConfig(LaunchServerRuntimeConfig config) throws IOException;
}
public static class LaunchServerDirectories {
public static final String UPDATES_NAME = "updates",
TRUSTSTORE_NAME = "truststore", LAUNCHERLIBRARIES_NAME = "launcher-libraries",
LAUNCHERLIBRARIESCOMPILE_NAME = "launcher-libraries-compile", LAUNCHERPACK_NAME = "launcher-pack",
KEY_NAME = ".keys", MODULES = "modules", LAUNCHER_MODULES = "launcher-modules",
LIBRARIES = "libraries", CONTROL_FILE = "control-file", PROGUARD_DIR = "proguard-libraries";
public Path updatesDir;
public Path librariesDir;
public Path launcherLibrariesDir;
public Path launcherLibrariesCompileDir;
public Path launcherPackDir;
public Path keyDirectory;
public Path proguardDir;
public Path dir;
public Path trustStore;
public Path tmpDir;
public Path modules;
public Path launcherModules;
public Path controlFile;
public void collect() {
if (updatesDir == null) updatesDir = getPath(UPDATES_NAME);
if (trustStore == null) trustStore = getPath(TRUSTSTORE_NAME);
if (launcherLibrariesDir == null) launcherLibrariesDir = getPath(LAUNCHERLIBRARIES_NAME);
if (launcherLibrariesCompileDir == null)
launcherLibrariesCompileDir = getPath(LAUNCHERLIBRARIESCOMPILE_NAME);
if (launcherPackDir == null)
launcherPackDir = getPath(LAUNCHERPACK_NAME);
if (keyDirectory == null) keyDirectory = getPath(KEY_NAME);
if (modules == null) modules = getPath(MODULES);
if (launcherModules == null) launcherModules = getPath(LAUNCHER_MODULES);
if (librariesDir == null) librariesDir = getPath(LIBRARIES);
if (controlFile == null) controlFile = getPath(CONTROL_FILE);
if (proguardDir == null) proguardDir = getPath(PROGUARD_DIR);
if (tmpDir == null)
tmpDir = Paths.get(System.getProperty("java.io.tmpdir")).resolve("launchserver-%s".formatted(SecurityHelper.randomStringToken()));
}
private Path getPath(String dirName) {
String property = System.getProperty("launchserver.dir." + dirName, null);
if (property == null) return dir.resolve(dirName);
else return Paths.get(property);
}
}
}

View file

@ -0,0 +1,113 @@
package pro.gravit.launchserver;
import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.manangers.CertificateManager;
import pro.gravit.launchserver.manangers.KeyAgreementManager;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.utils.command.CommandHandler;
import java.nio.file.Path;
public class LaunchServerBuilder {
private LaunchServerConfig config;
private LaunchServerRuntimeConfig runtimeConfig;
private CommandHandler commandHandler;
private LaunchServer.LaunchServerEnv env;
private LaunchServerModulesManager modulesManager;
private LaunchServer.LaunchServerDirectories directories = new LaunchServer.LaunchServerDirectories();
private KeyAgreementManager keyAgreementManager;
private CertificateManager certificateManager;
private LaunchServer.LaunchServerConfigManager launchServerConfigManager;
private Integer shardId;
public LaunchServerBuilder setConfig(LaunchServerConfig config) {
this.config = config;
return this;
}
public LaunchServerBuilder setEnv(LaunchServer.LaunchServerEnv env) {
this.env = env;
return this;
}
public LaunchServerBuilder setModulesManager(LaunchServerModulesManager modulesManager) {
this.modulesManager = modulesManager;
return this;
}
public LaunchServerBuilder setRuntimeConfig(LaunchServerRuntimeConfig runtimeConfig) {
this.runtimeConfig = runtimeConfig;
return this;
}
public LaunchServerBuilder setCommandHandler(CommandHandler commandHandler) {
this.commandHandler = commandHandler;
return this;
}
public LaunchServerBuilder setDirectories(LaunchServer.LaunchServerDirectories directories) {
this.directories = directories;
return this;
}
public LaunchServerBuilder setDir(Path dir) {
this.directories.dir = dir;
return this;
}
public LaunchServerBuilder setShardId(Integer shardId) {
this.shardId = shardId;
return this;
}
public LaunchServerBuilder setLaunchServerConfigManager(LaunchServer.LaunchServerConfigManager launchServerConfigManager) {
this.launchServerConfigManager = launchServerConfigManager;
return this;
}
public LaunchServer build() throws Exception {
directories.collect();
if (launchServerConfigManager == null) {
launchServerConfigManager = new NullLaunchServerConfigManager();
}
if (keyAgreementManager == null) {
keyAgreementManager = new KeyAgreementManager(directories.keyDirectory);
}
if(shardId == null) {
shardId = Integer.parseInt(System.getProperty("launchserver.shardId", "0"));
}
return new LaunchServer(directories, env, config, runtimeConfig, launchServerConfigManager, modulesManager, keyAgreementManager, commandHandler, certificateManager, shardId);
}
public LaunchServerBuilder setCertificateManager(CertificateManager certificateManager) {
this.certificateManager = certificateManager;
return this;
}
public void setKeyAgreementManager(KeyAgreementManager keyAgreementManager) {
this.keyAgreementManager = keyAgreementManager;
}
private static class NullLaunchServerConfigManager implements LaunchServer.LaunchServerConfigManager {
@Override
public LaunchServerConfig readConfig() {
throw new UnsupportedOperationException();
}
@Override
public LaunchServerRuntimeConfig readRuntimeConfig() {
throw new UnsupportedOperationException();
}
@Override
public void writeConfig(LaunchServerConfig config) {
throw new UnsupportedOperationException();
}
@Override
public void writeRuntimeConfig(LaunchServerRuntimeConfig config) {
throw new UnsupportedOperationException();
}
}
}

View file

@ -0,0 +1,330 @@
package pro.gravit.launchserver;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.core.LauncherTrustManager;
import pro.gravit.launcher.base.modules.events.PreConfigPhase;
import pro.gravit.launcher.base.profiles.optional.actions.OptionalAction;
import pro.gravit.launcher.base.profiles.optional.triggers.OptionalTrigger;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launcher.base.request.auth.GetAvailabilityAuthRequest;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.launchserver.auth.mix.MixProvider;
import pro.gravit.launchserver.auth.password.PasswordVerifier;
import pro.gravit.launchserver.auth.profiles.ProfileProvider;
import pro.gravit.launchserver.auth.protect.ProtectHandler;
import pro.gravit.launchserver.auth.texture.TextureProvider;
import pro.gravit.launchserver.auth.updates.UpdatesProvider;
import pro.gravit.launchserver.components.Component;
import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.manangers.CertificateManager;
import pro.gravit.launchserver.manangers.LaunchServerGsonManager;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.launchserver.socket.WebSocketService;
import pro.gravit.utils.command.CommandHandler;
import pro.gravit.utils.command.JLineCommandHandler;
import pro.gravit.utils.command.StdCommandHandler;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.LogHelper;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.Security;
import java.security.cert.CertificateException;
import java.util.List;
public class LaunchServerStarter {
public static final boolean allowUnsigned = Boolean.getBoolean("launchserver.allowUnsigned");
public static final boolean prepareMode = Boolean.getBoolean("launchserver.prepareMode");
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) throws Exception {
JVMHelper.verifySystemProperties(LaunchServer.class, false);
//LogHelper.addOutput(IOHelper.WORKING_DIR.resolve("LaunchServer.log"));
LogHelper.printVersion("LaunchServer");
LogHelper.printLicense("LaunchServer");
Path dir = IOHelper.WORKING_DIR;
Path configFile, runtimeConfigFile;
try {
Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
Security.addProvider(new BouncyCastleProvider());
} catch (ClassNotFoundException | NoClassDefFoundError ex) {
LogHelper.error("Library BouncyCastle not found! Is directory 'libraries' empty?");
return;
}
LaunchServer.LaunchServerDirectories directories = new LaunchServer.LaunchServerDirectories();
directories.dir = dir;
directories.collect();
CertificateManager certificateManager = new CertificateManager();
try {
certificateManager.readTrustStore(directories.trustStore);
} catch (CertificateException e) {
throw new IOException(e);
}
{
LauncherTrustManager.CheckClassResult result = certificateManager.checkClass(LaunchServer.class);
if (result.type == LauncherTrustManager.CheckClassResultType.SUCCESS) {
logger.info("LaunchServer signed by {}", result.endCertificate.getSubjectX500Principal().getName());
} else if (result.type == LauncherTrustManager.CheckClassResultType.NOT_SIGNED) {
// None
} else {
if (result.exception != null) {
logger.error(result.exception);
}
logger.warn("LaunchServer signed incorrectly. Status: {}", result.type.name());
}
}
LaunchServerRuntimeConfig runtimeConfig;
LaunchServerConfig config;
LaunchServer.LaunchServerEnv env = LaunchServer.LaunchServerEnv.PRODUCTION;
LaunchServerModulesManager modulesManager = new LaunchServerModulesManager(directories.modules, dir.resolve("config"), certificateManager.trustManager);
modulesManager.autoload();
modulesManager.initModules(null);
registerAll();
initGson(modulesManager);
printExperimentalBranch();
if (IOHelper.exists(dir.resolve("LaunchServer.conf"))) {
configFile = dir.resolve("LaunchServer.conf");
} else {
configFile = dir.resolve("LaunchServer.json");
}
if (IOHelper.exists(dir.resolve("RuntimeLaunchServer.conf"))) {
runtimeConfigFile = dir.resolve("RuntimeLaunchServer.conf");
} else {
runtimeConfigFile = dir.resolve("RuntimeLaunchServer.json");
}
CommandHandler localCommandHandler;
try {
Class.forName("org.jline.terminal.Terminal");
// JLine2 available
localCommandHandler = new JLineCommandHandler();
logger.info("JLine2 terminal enabled");
} catch (ClassNotFoundException ignored) {
localCommandHandler = new StdCommandHandler(true);
logger.warn("JLine2 isn't in classpath, using std");
}
modulesManager.invokeEvent(new PreConfigPhase());
generateConfigIfNotExists(configFile, localCommandHandler, env);
logger.info("Reading LaunchServer config file");
try (BufferedReader reader = IOHelper.newReader(configFile)) {
config = Launcher.gsonManager.gson.fromJson(reader, LaunchServerConfig.class);
}
if (!Files.exists(runtimeConfigFile)) {
logger.info("Reset LaunchServer runtime config file");
runtimeConfig = new LaunchServerRuntimeConfig();
runtimeConfig.reset();
} else {
logger.info("Reading LaunchServer runtime config file");
try (BufferedReader reader = IOHelper.newReader(runtimeConfigFile)) {
runtimeConfig = Launcher.gsonManager.gson.fromJson(reader, LaunchServerRuntimeConfig.class);
}
}
LaunchServer.LaunchServerConfigManager launchServerConfigManager = new BasicLaunchServerConfigManager(configFile, runtimeConfigFile);
LaunchServer server = new LaunchServerBuilder()
.setDirectories(directories)
.setEnv(env)
.setCommandHandler(localCommandHandler)
.setRuntimeConfig(runtimeConfig)
.setConfig(config)
.setModulesManager(modulesManager)
.setLaunchServerConfigManager(launchServerConfigManager)
.setCertificateManager(certificateManager)
.build();
List<String> allArgs = List.of(args);
boolean isPrepareMode = prepareMode || allArgs.contains("--prepare");
boolean isRunCommand = false;
String runCommand = null;
for(var e : allArgs) {
if(e.equals("--run")) {
isRunCommand = true;
continue;
}
if(isRunCommand) {
runCommand = e;
isRunCommand = false;
}
}
if(runCommand != null) {
localCommandHandler.eval(runCommand, false);
}
if (!isPrepareMode) {
server.run();
} else {
server.close();
}
}
public static void initGson(LaunchServerModulesManager modulesManager) {
Launcher.gsonManager = new LaunchServerGsonManager(modulesManager);
Launcher.gsonManager.initGson();
}
public static void registerAll() {
AuthCoreProvider.registerProviders();
PasswordVerifier.registerProviders();
TextureProvider.registerProviders();
Component.registerComponents();
ProtectHandler.registerHandlers();
WebSocketService.registerResponses();
AuthRequest.registerProviders();
GetAvailabilityAuthRequest.registerProviders();
OptionalAction.registerProviders();
OptionalTrigger.registerProviders();
MixProvider.registerProviders();
ProfileProvider.registerProviders();
UpdatesProvider.registerProviders();
}
private static void printExperimentalBranch() {
try(Reader reader = IOHelper.newReader(IOHelper.getResourceURL("experimental-build.json"))) {
ExperimentalBuild info = Launcher.gsonManager.configGson.fromJson(reader, ExperimentalBuild.class);
if(info.features == null || info.features.isEmpty()) {
return;
}
logger.warn("This is experimental build. Please do not use this in production");
logger.warn("Experimental features: [{}]", String.join(",", info.features));
for(var e : info.info) {
logger.warn(e);
}
} catch (Throwable e) {
logger.warn("Build information not found");
}
}
record ExperimentalBuild(List<String> features, List<String> info) {
}
public static void generateConfigIfNotExists(Path configFile, CommandHandler commandHandler, LaunchServer.LaunchServerEnv env) throws IOException {
if (IOHelper.isFile(configFile))
return;
// Create new config
logger.info("Creating LaunchServer config");
LaunchServerConfig newConfig = LaunchServerConfig.getDefault(env);
// Set server address
String address;
if (env.equals(LaunchServer.LaunchServerEnv.TEST)) {
address = "localhost";
newConfig.setProjectName("test");
} else {
address = System.getenv("ADDRESS");
if (address == null) {
address = System.getProperty("launchserver.address", null);
}
if (address == null) {
System.out.println("External launchServer address:port (default: localhost:9274): ");
address = commandHandler.readLine();
}
String projectName = System.getenv("PROJECTNAME");
if (projectName == null) {
projectName = System.getProperty("launchserver.projectname", null);
}
if (projectName == null) {
System.out.println("LaunchServer projectName: ");
projectName = commandHandler.readLine();
}
newConfig.setProjectName(projectName);
}
if (address == null || address.isEmpty()) {
logger.error("Address null. Using localhost:9274");
address = "localhost:9274";
}
if (newConfig.projectName == null || newConfig.projectName.isEmpty()) {
logger.error("ProjectName null. Using MineCraft");
newConfig.projectName = "MineCraft";
}
int port = 9274;
if(address.contains(":")) {
String portString = address.substring(address.indexOf(':')+1);
try {
port = Integer.parseInt(portString);
} catch (NumberFormatException e) {
logger.warn("Unknown port {}, using 9274", portString);
}
} else {
logger.info("Address {} doesn't contains port (you want to use nginx?)", address);
}
newConfig.netty.address = "ws://" + address + "/api";
newConfig.netty.downloadURL = "http://" + address + "/%dirname%/";
newConfig.netty.launcherURL = "http://" + address + "/Launcher.jar";
newConfig.netty.launcherEXEURL = "http://" + address + "/Launcher.exe";
newConfig.netty.binds[0].port = port;
// Write LaunchServer config
logger.info("Writing LaunchServer config file");
try (BufferedWriter writer = IOHelper.newWriter(configFile)) {
Launcher.gsonManager.configGson.toJson(newConfig, writer);
}
}
private static class BasicLaunchServerConfigManager implements LaunchServer.LaunchServerConfigManager {
private final Path configFile;
private final Path runtimeConfigFile;
public BasicLaunchServerConfigManager(Path configFile, Path runtimeConfigFile) {
this.configFile = configFile;
this.runtimeConfigFile = runtimeConfigFile;
}
@Override
public LaunchServerConfig readConfig() throws IOException {
LaunchServerConfig config1;
try (BufferedReader reader = IOHelper.newReader(configFile)) {
config1 = Launcher.gsonManager.gson.fromJson(reader, LaunchServerConfig.class);
}
return config1;
}
@Override
public LaunchServerRuntimeConfig readRuntimeConfig() throws IOException {
LaunchServerRuntimeConfig config1;
try (BufferedReader reader = IOHelper.newReader(runtimeConfigFile)) {
config1 = Launcher.gsonManager.gson.fromJson(reader, LaunchServerRuntimeConfig.class);
}
return config1;
}
@Override
public void writeConfig(LaunchServerConfig config) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (Writer writer = IOHelper.newWriter(output)) {
if (Launcher.gsonManager.configGson != null) {
Launcher.gsonManager.configGson.toJson(config, writer);
} else {
logger.error("Error writing LaunchServer config file. Gson is null");
}
}
byte[] bytes = output.toByteArray();
if(bytes.length > 0) {
IOHelper.write(configFile, bytes);
}
}
@Override
public void writeRuntimeConfig(LaunchServerRuntimeConfig config) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (Writer writer = IOHelper.newWriter(output)) {
if (Launcher.gsonManager.configGson != null) {
Launcher.gsonManager.configGson.toJson(config, writer);
} else {
logger.error("Error writing LaunchServer runtime config file. Gson is null");
}
}
byte[] bytes = output.toByteArray();
if(bytes.length > 0) {
IOHelper.write(runtimeConfigFile, bytes);
}
}
}
}

View file

@ -0,0 +1,96 @@
package pro.gravit.launchserver;
import pro.gravit.launchserver.holder.LaunchServerControlHolder;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.launch.ClassLoaderControl;
import pro.gravit.utils.launch.LaunchOptions;
import pro.gravit.utils.launch.ModuleLaunch;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Main {
private static final List<String> classpathOnly = List.of("proguard", "progressbar", "kotlin");
private static final String LOG4J_PROPERTY = "log4j2.configurationFile";
private static final String DEBUG_PROPERTY = "launchserver.main.debug";
private static final String LIBRARIES_PROPERTY = "launchserver.dir.libraries";
private static boolean isClasspathOnly(Path path) {
var fileName = path.getFileName().toString();
for(var e : classpathOnly) {
if(fileName.contains(e)) {
return true;
}
}
return false;
}
private static void unpackLog4j() {
String log4jConfigurationFile = System.getProperty(LOG4J_PROPERTY);
if(log4jConfigurationFile == null) {
Path log4jConfigPath = Path.of("log4j2.xml");
if(!Files.exists(log4jConfigPath)) {
try(FileOutputStream output = new FileOutputStream(log4jConfigPath.toFile())) {
try(InputStream input = Main.class.getResourceAsStream("/log4j2.xml")) {
if(input == null) {
return;
}
input.transferTo(output);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
System.setProperty(LOG4J_PROPERTY, log4jConfigPath.toAbsolutePath().toString());
}
}
public static void main(String[] args) throws Throwable {
unpackLog4j();
ModuleLaunch launch = new ModuleLaunch();
LaunchOptions options = new LaunchOptions();
options.moduleConf = new LaunchOptions.ModuleConf();
Path librariesPath = Path.of(System.getProperty(LIBRARIES_PROPERTY, "libraries"));
List<Path> libraries;
try(Stream<Path> files = Files.walk(librariesPath, FileVisitOption.FOLLOW_LINKS)) {
libraries = new ArrayList<>(files.filter(e -> e.getFileName().toString().endsWith(".jar")).toList());
}
List<Path> classpath = new ArrayList<>();
List<String> modulepath = new ArrayList<>();
for(var l : libraries) {
if(isClasspathOnly(l)) {
classpath.add(l);
} else {
modulepath.add(l.toAbsolutePath().toString());
}
}
classpath.add(IOHelper.getCodeSource(LaunchServerStarter.class));
options.moduleConf.modulePath.addAll(modulepath);
options.moduleConf.modules.add("ALL-MODULE-PATH");
options.moduleConf.enableNativeAccess.add("org.fusesource.jansi");
options.moduleConf.enableNativeAccess.add("io.netty.common");
ClassLoaderControl control = launch.init(classpath, "natives", options);
control.clearLauncherPackages();
control.addLauncherPackage("pro.gravit.utils.launch");
control.addLauncherPackage("pro.gravit.launchserver.holder");
ModuleLayer.Controller controller = (ModuleLayer.Controller) control.getJava9ModuleController();
LaunchServerControlHolder.setControl(control);
LaunchServerControlHolder.setController(controller);
if(Boolean.getBoolean(DEBUG_PROPERTY)) {
for(var e : controller.layer().modules()) {
System.out.printf("Module %s\n", e.getName());
for(var p : e.getPackages()) {
System.out.printf("Package %s\n", p);
}
}
}
launch.launch("pro.gravit.launchserver.LaunchServerStarter", null, Arrays.asList(args));
}
}

View file

@ -0,0 +1,23 @@
package pro.gravit.launchserver;
import pro.gravit.utils.command.Command;
import java.util.HashMap;
import java.util.Map;
/**
* Allows calling commands using the config command
*/
public interface Reconfigurable {
/**
* Gets a list of commands available for this object.
*
* @return Key - Command Name
* Value is a command object
*/
Map<String, Command> getCommands();
default Map<String, Command> defaultCommandsMap() {
return new HashMap<>();
}
}

View file

@ -0,0 +1,19 @@
package pro.gravit.launchserver;
import java.lang.instrument.Instrumentation;
import java.nio.file.*;
public final class StarterAgent {
public static Instrumentation inst = null;
public static Path libraries = null;
private static boolean isStarted = false;
public static boolean isAgentStarted() {
return isStarted;
}
public static void premain(String agentArgument, Instrumentation inst) {
throw new UnsupportedOperationException("Please remove -javaagent option from start.sh");
}
}

View file

@ -0,0 +1,168 @@
package pro.gravit.launchserver.asm;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import pro.gravit.utils.helper.IOHelper;
import java.io.Closeable;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.jar.JarFile;
/**
* Позволяет искать методы внутри незагруженных классов и общие суперклассы для
* чего угодно. Работает через поиск class-файлов в classpath.
*/
public class ClassMetadataReader implements Closeable {
private final Logger logger = LogManager.getLogger(ClassMetadataReader.class);
private final List<JarFile> cp;
private final Map<String, Module> moduleClassFinder;
public ClassMetadataReader(List<JarFile> cp) {
this.cp = cp;
//var moduleLayer = ClassMetadataReader.class.getModule().getLayer() == null ? ModuleLayer.boot() : ClassMetadataReader.class.getModule().getLayer();
var moduleLayer = ModuleLayer.boot();
moduleClassFinder = collectModulePackages(moduleLayer);
}
public ClassMetadataReader() {
this.cp = new ArrayList<>();
//var moduleLayer = ClassMetadataReader.class.getModule().getLayer() == null ? ModuleLayer.boot() : ClassMetadataReader.class.getModule().getLayer();
var moduleLayer = ModuleLayer.boot();
moduleClassFinder = collectModulePackages(moduleLayer);
}
private Map<String, Module> collectModulePackages(ModuleLayer layer) {
var map = new HashMap<String, Module>();
for(var m : layer.modules()) {
for(var p : m.getPackages()) {
map.put(p, m);
}
}
return map;
}
public List<JarFile> getCp() {
return cp;
}
public void acceptVisitor(byte[] classData, ClassVisitor visitor) {
new ClassReader(classData).accept(visitor, 0);
}
public void acceptVisitor(String className, ClassVisitor visitor) throws IOException {
acceptVisitor(getClassData(className), visitor);
}
public void acceptVisitor(byte[] classData, ClassVisitor visitor, int flags) {
new ClassReader(classData).accept(visitor, flags);
}
public void acceptVisitor(String className, ClassVisitor visitor, int flags) throws IOException {
acceptVisitor(getClassData(className), visitor, flags);
}
public byte[] getClassData(String className) throws IOException {
for (JarFile f : cp) {
if (f.getEntry(className + ".class") != null) {
byte[] bytes;
try (InputStream in = f.getInputStream(f.getEntry(className + ".class"))) {
bytes = IOHelper.read(in);
}
return bytes;
}
}
if(ClassMetadataReader.class.getModule().isNamed()) {
String pkg = getClassPackage(className).replace('/', '.');
var module = moduleClassFinder.get(pkg);
if(module != null) {
var cl = module.getClassLoader();
if(cl == null) {
cl = ClassLoader.getPlatformClassLoader();
}
var stream = cl.getResourceAsStream(className+".class");
if(stream != null) {
try(stream) {
return IOHelper.read(stream);
}
} else {
throw new FileNotFoundException("Class "+className + ".class");
}
} else {
throw new FileNotFoundException("Package "+pkg);
}
}
var stream = ClassLoader.getSystemClassLoader().getResourceAsStream(className+".class");
if(stream != null) {
try(stream) {
return IOHelper.read(stream);
}
} else {
throw new FileNotFoundException(className + ".class");
}
}
private String getClassPackage(String type) {
int idx = type.lastIndexOf("/");
if(idx <= 0) {
return type;
}
return type.substring(0, idx);
}
public String getSuperClass(String type) {
if (type.equals("java/lang/Object")) return null;
try {
return getSuperClassASM(type);
} catch (Exception e) {
logger.warn("getSuperClass: type {} not found ({}: {})", type, e.getClass().getName(), e.getMessage());
return "java/lang/Object";
}
}
protected String getSuperClassASM(String type) throws IOException {
CheckSuperClassVisitor cv = new CheckSuperClassVisitor();
acceptVisitor(type, cv);
return cv.superClassName;
}
/**
* Возвращает суперклассы в порядке возрастающей конкретности (начиная с
* java/lang/Object и заканчивая данным типом)
*/
public ArrayList<String> getSuperClasses(String type) {
ArrayList<String> superclasses = new ArrayList<>(1);
superclasses.add(type);
while ((type = getSuperClass(type)) != null)
superclasses.add(type);
Collections.reverse(superclasses);
return superclasses;
}
@Override
public void close() {
cp.forEach(IOHelper::close);
cp.clear();
}
private static class CheckSuperClassVisitor extends ClassVisitor {
String superClassName;
public CheckSuperClassVisitor() {
super(Opcodes.ASM9);
}
@Override
public void visit(int version, int access, String name, String signature, String superName,
String[] interfaces) {
superClassName = superName;
}
}
}

View file

@ -0,0 +1,254 @@
package pro.gravit.launchserver.asm;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.*;
import pro.gravit.launcher.core.LauncherInject;
import pro.gravit.launcher.core.LauncherInjectionConstructor;
import pro.gravit.launchserver.binary.BuildContext;
import pro.gravit.launchserver.binary.tasks.MainBuildTask;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
@SuppressWarnings("rawtypes")
public class InjectClassAcceptor implements MainBuildTask.ASMTransformer {
private static final List<Class<?>> primitiveLDCClasses = Arrays.asList(java.lang.Integer.class, java.lang.Long.class,
java.lang.Float.class, java.lang.Double.class, java.lang.String.class);
private static final String INJECTED_FIELD_DESC = Type.getDescriptor(LauncherInject.class);
private static final String INJECTED_CONSTRUCTOR_DESC = Type.getDescriptor(LauncherInjectionConstructor.class);
private static final List<String> primitiveLDCDescriptors = Arrays.asList(Type.INT_TYPE.getDescriptor(), Type.DOUBLE_TYPE.getDescriptor(),
Type.FLOAT_TYPE.getDescriptor(), Type.LONG_TYPE.getDescriptor(), Type.getDescriptor(String.class));
private static final Map<Class<?>, Serializer<?>> serializers;
static {
serializers = new HashMap<>();
serializers.put(List.class, new ListSerializer());
serializers.put(Map.class, new MapSerializer());
serializers.put(byte[].class, new ByteArraySerializer());
serializers.put(Short.class, serializerClass(Opcodes.I2S));
serializers.put(Byte.class, serializerClass(Opcodes.I2B));
serializers.put(Type.class, (Serializer<Type>) e -> { // ow.Type == java.lang.Class in LDC
InsnList ret = new InsnList();
ret.add(new LdcInsnNode(e));
return ret;
});
serializers.put(Boolean.class, (Serializer<Boolean>) e -> {
InsnList ret = new InsnList();
ret.add(new InsnNode(e ? Opcodes.ICONST_1 : Opcodes.ICONST_0));
return ret;
});
serializers.put(Character.class, (Serializer<Character>) e -> {
InsnList ret = new InsnList();
ret.add(NodeUtils.push((int) e));
ret.add(new InsnNode(Opcodes.I2C));
return ret;
});
serializers.put(Enum.class, (Serializer<Enum>) NodeUtils::makeValueEnumGetter);
}
private final Map<String, Object> values;
public InjectClassAcceptor(Map<String, Object> values) {
this.values = values;
}
private static void visit(ClassNode classNode, Map<String, Object> values) {
MethodNode clinitMethod = classNode.methods.stream().filter(methodNode -> "<clinit>".equals(methodNode.name))
.findFirst().orElseGet(() -> {
MethodNode newClinitMethod = new MethodNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC,
"<clinit>", "()V", null, null);
newClinitMethod.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(newClinitMethod);
return newClinitMethod;
});
List<MethodNode> constructors = classNode.methods.stream().filter(method -> "<init>".equals(method.name))
.toList();
MethodNode initMethod = constructors.stream().filter(method -> method.invisibleAnnotations != null
&& method.invisibleAnnotations.stream().anyMatch(annotation -> INJECTED_CONSTRUCTOR_DESC.equals(annotation.desc))).findFirst()
.orElseGet(() -> constructors.stream().filter(method -> method.desc.equals("()V")).findFirst().orElse(null));
classNode.fields.forEach(field -> {
// Notice that fields that will be used with this algo should not have default
// value by = ...;
boolean isStatic = (field.access & Opcodes.ACC_STATIC) != 0;
injectTo(isStatic ? clinitMethod : initMethod, classNode, field, isStatic, values);
});
}
public static void injectTo(MethodNode initMethod, ClassNode classNode, FieldNode field, boolean isStatic, Map<String, Object> values) {
AnnotationNode valueAnnotation = field.invisibleAnnotations != null ? field.invisibleAnnotations.stream()
.filter(annotation -> INJECTED_FIELD_DESC.equals(annotation.desc)).findFirst()
.orElse(null) : null;
if (valueAnnotation == null) {
return;
}
field.invisibleAnnotations.remove(valueAnnotation);
AtomicReference<String> valueName = new AtomicReference<>(null);
valueAnnotation.accept(new AnnotationVisitor(Opcodes.ASM7) {
@Override
public void visit(final String name, final Object value) {
if ("value".equals(name)) {
if (value.getClass() != String.class)
throw new IllegalArgumentException(
"Invalid annotation with value class %s".formatted(field.getClass().getName()));
valueName.set(value.toString());
}
}
});
if (valueName.get() == null) {
throw new IllegalArgumentException("Annotation should always contains 'value' key");
}
if (!values.containsKey(valueName.get())) {
return;
}
Object value = values.get(valueName.get());
//if ((field.access & Opcodes.ACC_STATIC) != 0) {
if (isStatic) {
if (primitiveLDCDescriptors.contains(field.desc) && primitiveLDCClasses.contains(value.getClass())) {
field.value = value;
return;
}
List<FieldInsnNode> putStaticNodes = Arrays.stream(initMethod.instructions.toArray())
.filter(node -> node instanceof FieldInsnNode && node.getOpcode() == Opcodes.PUTSTATIC).map(p -> (FieldInsnNode) p)
.filter(node -> node.owner.equals(classNode.name) && node.name.equals(field.name) && node.desc.equals(field.desc)).toList();
InsnList setter = serializeValue(value);
if (putStaticNodes.isEmpty()) {
setter.add(new FieldInsnNode(Opcodes.PUTSTATIC, classNode.name, field.name, field.desc));
Arrays.stream(initMethod.instructions.toArray()).filter(node -> node.getOpcode() == Opcodes.RETURN)
.forEach(node -> initMethod.instructions.insertBefore(node, setter));
} else {
setter.insert(new InsnNode(Type.getType(field.desc).getSize() == 1 ? Opcodes.POP : Opcodes.POP2));
for (FieldInsnNode fieldInsnNode : putStaticNodes) {
initMethod.instructions.insertBefore(fieldInsnNode, setter);
}
}
} else {
if (initMethod == null) {
throw new IllegalArgumentException("Not found init in target: %s".formatted(classNode.name));
}
List<FieldInsnNode> putFieldNodes = Arrays.stream(initMethod.instructions.toArray())
.filter(node -> node instanceof FieldInsnNode && node.getOpcode() == Opcodes.PUTFIELD).map(p -> (FieldInsnNode) p)
.filter(node -> node.owner.equals(classNode.name) && node.name.equals(field.name) && node.desc.equals(field.desc)).toList();
InsnList setter = serializeValue(value);
if (putFieldNodes.isEmpty()) {
setter.insert(new VarInsnNode(Opcodes.ALOAD, 0));
setter.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, field.name, field.desc));
Arrays.stream(initMethod.instructions.toArray())
.filter(node -> node.getOpcode() == Opcodes.RETURN)
.forEach(node -> initMethod.instructions.insertBefore(node, setter));
} else {
setter.insert(new InsnNode(Type.getType(field.desc).getSize() == 1 ? Opcodes.POP : Opcodes.POP2));
for (FieldInsnNode fieldInsnNode : putFieldNodes) {
initMethod.instructions.insertBefore(fieldInsnNode, setter);
}
}
}
}
private static Serializer<?> serializerClass(int opcode) {
return (Serializer<Number>) value -> {
InsnList ret = new InsnList();
ret.add(NodeUtils.push(value.intValue()));
ret.add(new InsnNode(opcode));
return ret;
};
}
@SuppressWarnings("unchecked")
private static InsnList serializeValue(Object value) {
if (value == null) {
InsnList insnList = new InsnList();
insnList.add(new InsnNode(Opcodes.ACONST_NULL));
return insnList;
}
if (primitiveLDCClasses.contains(value.getClass())) {
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(value));
return insnList;
}
for (Map.Entry<Class<?>, Serializer<?>> serializerEntry : serializers.entrySet()) {
if (serializerEntry.getKey().isInstance(value)) {
return ((Serializer) serializerEntry.getValue()).serialize(value);
}
}
throw new UnsupportedOperationException("Serialization of type %s is not supported".formatted(value.getClass()));
}
public static boolean isSerializableValue(Object value) {
if (value == null) return true;
if (primitiveLDCClasses.contains(value.getClass())) return true;
for (Map.Entry<Class<?>, Serializer<?>> serializerEntry : serializers.entrySet()) {
if (serializerEntry.getKey().isInstance(value)) {
return true;
}
}
return false;
}
@Override
public void transform(ClassNode classNode, String className, BuildContext context) {
visit(classNode, values);
}
@FunctionalInterface
private interface Serializer<T> {
InsnList serialize(T value);
}
private static class ListSerializer implements Serializer<List> {
@Override
public InsnList serialize(List value) {
InsnList insnList = new InsnList();
insnList.add(new TypeInsnNode(Opcodes.NEW, Type.getInternalName(ArrayList.class)));
insnList.add(new InsnNode(Opcodes.DUP));
insnList.add(NodeUtils.push(value.size()));
insnList.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, Type.getInternalName(ArrayList.class), "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE), false));
for (Object object : value) {
insnList.add(new InsnNode(Opcodes.DUP));
insnList.add(serializeValue(object));
insnList.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(List.class), "add",
Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.getType(Object.class)), true));
insnList.add(new InsnNode(Opcodes.POP));
}
return insnList;
}
}
private static class MapSerializer implements Serializer<Map> {
@Override
public InsnList serialize(Map value) {
InsnList insnList = new InsnList();
insnList.add(new TypeInsnNode(Opcodes.NEW, Type.getInternalName(value.getClass())));
insnList.add(new InsnNode(Opcodes.DUP));
insnList.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, Type.getInternalName(value.getClass()), "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE), false));
for (Object entryObject : value.entrySet()) {
Map.Entry entry = (Map.Entry) entryObject;
insnList.add(new InsnNode(Opcodes.DUP));
insnList.add(serializeValue(entry.getKey()));
insnList.add(serializeValue(entry.getValue()));
insnList.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(Map.class), "put",
Type.getMethodDescriptor(Type.getType(Object.class), Type.getType(Object.class), Type.getType(Object.class)),
true));
insnList.add(new InsnNode(Opcodes.POP));
}
return insnList;
}
}
private static class ByteArraySerializer implements Serializer<byte[]> {
@Override
public InsnList serialize(byte[] value) {
InsnList insnList = new InsnList();
insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(Base64.class),
"getDecoder", Type.getMethodDescriptor(Type.getType(Base64.Decoder.class)), false));
insnList.add(NodeUtils.getSafeStringInsnList(Base64.getEncoder().encodeToString(value)));
insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Base64.Decoder.class),
"decode", Type.getMethodDescriptor(Type.getType(byte[].class), Type.getType(String.class)),
false));
return insnList;
}
}
}

View file

@ -0,0 +1,243 @@
package pro.gravit.launchserver.asm;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.*;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JarHelper;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.objectweb.asm.Opcodes.*;
public final class NodeUtils {
public static final int MAX_SAFE_BYTE_COUNT = 65535 - Byte.MAX_VALUE;
private NodeUtils() {
}
public static ClassNode forClass(Class<?> cls, int flags) {
try (InputStream in = JarHelper.getClassBytesStream(cls)) {
ClassNode ret = new ClassNode();
new ClassReader(IOHelper.read(in)).accept(ret, flags);
return ret;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static ClassNode forClass(String clazz, int flags, ClassMetadataReader r) {
try {
ClassNode ret = new ClassNode();
r.acceptVisitor(clazz, ret, flags);
return ret;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static List<AnnotationNode> annots(String clazz, String method, ClassMetadataReader r) {
if (clazz.startsWith("L")) clazz = Type.getType(clazz).getInternalName();
try {
List<AnnotationNode> ret = new ArrayList<>();
ClassNode n = forClass(clazz, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG, r);
if (n.visibleAnnotations != null) ret.addAll(n.visibleAnnotations);
if (n.invisibleAnnotations != null) ret.addAll(n.invisibleAnnotations);
for (MethodNode m : n.methods)
if (method.equals(m.name)) {
if (m.visibleAnnotations != null) ret.addAll(m.visibleAnnotations);
if (m.invisibleAnnotations != null) ret.addAll(m.invisibleAnnotations);
}
return ret;
} catch (Throwable e) {
return Collections.emptyList();
}
}
private static int doMethodEmulation(String desc) {
int result = 0;
Type returnType = Type.getReturnType(desc);
if (returnType.getSort() == Type.LONG || returnType.getSort() == Type.DOUBLE)
result++;
if (returnType.getSort() != Type.VOID)
result++;
return result;
}
public static int opcodeEmulation(AbstractInsnNode e) {
int stackSize = 0;
switch (e.getOpcode()) {
case NOP:
case LALOAD: // (index, arrayref) -> (long, long_top)
case DALOAD: // (index, arrayref) -> (double, double_top)
case SWAP: // (value1, value2) -> (value2, value1)
case INEG:
case LNEG:
case FNEG:
case DNEG:
case IINC:
case I2F:
case L2D:
case F2I:
case D2L:
case I2B:
case I2C:
case I2S:
case GOTO:
case RETURN:
case NEWARRAY:
case ANEWARRAY:
case ARRAYLENGTH:
case CHECKCAST:
case INSTANCEOF:
// Does nothing
break;
case ACONST_NULL:
case ICONST_M1:
case ICONST_0:
case ICONST_1:
case ICONST_2:
case ICONST_3:
case ICONST_4:
case ICONST_5:
case FCONST_0:
case FCONST_1:
case FCONST_2:
case BIPUSH:
case SIPUSH:
case ILOAD:
case FLOAD:
case ALOAD:
case DUP:
case DUP_X1:
case DUP_X2:
case I2L:
case I2D:
case F2L:
case F2D:
case NEW:
// Pushes one-word constant to stack
stackSize++;
break;
case LDC:
LdcInsnNode ldc = (LdcInsnNode) e;
if (ldc.cst instanceof Long || ldc.cst instanceof Double)
stackSize++;
stackSize++;
break;
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
case LLOAD:
case DLOAD:
case DUP2:
case DUP2_X1:
case DUP2_X2:
// Pushes two-word constant or two one-word constants to stack
stackSize++;
stackSize++;
break;
case INVOKEVIRTUAL:
case INVOKESPECIAL:
case INVOKEINTERFACE, INVOKESTATIC:
stackSize += doMethodEmulation(((MethodInsnNode) e).desc);
break;
case INVOKEDYNAMIC:
stackSize += doMethodEmulation(((InvokeDynamicInsnNode) e).desc);
break;
case JSR:
case RET:
throw new RuntimeException("Did not expect JSR/RET instructions");
default:
break;
}
return stackSize;
}
public static InsnList getSafeStringInsnList(String string) {
InsnList insnList = new InsnList();
if ((string.length() * 3) < MAX_SAFE_BYTE_COUNT) { // faster check
insnList.add(new LdcInsnNode(string));
return insnList;
}
insnList.add(new TypeInsnNode(NEW, "java/lang/StringBuilder"));
insnList.add(new InsnNode(DUP));
insnList.add(new MethodInsnNode(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false));
String[] chunks = splitUtf8ToChunks(string, MAX_SAFE_BYTE_COUNT);
for (String chunk : chunks) {
insnList.add(new LdcInsnNode(chunk));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false));
}
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false));
return insnList;
}
public static String[] splitUtf8ToChunks(String text, int maxBytes) {
List<String> parts = new ArrayList<>();
char[] chars = text.toCharArray();
int lastCharIndex = 0;
int currentChunkSize = 0;
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
int charSize = getUtf8CharSize(c);
if (currentChunkSize + charSize < maxBytes) {
currentChunkSize += charSize;
} else {
parts.add(text.substring(lastCharIndex, i));
currentChunkSize = 0;
lastCharIndex = i;
}
}
if (currentChunkSize != 0) {
parts.add(text.substring(lastCharIndex));
}
return parts.toArray(new String[0]);
}
public static int getUtf8CharSize(char c) {
if (c >= 0x0001 && c <= 0x007F) {
return 1;
} else if (c <= 0x07FF) {
return 2;
}
return 3;
}
public static InsnList push(final int value) {
InsnList ret = new InsnList();
if (value >= -1 && value <= 5)
ret.add(new InsnNode(Opcodes.ICONST_0 + value));
else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE)
ret.add(new IntInsnNode(Opcodes.BIPUSH, value));
else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE)
ret.add(new IntInsnNode(Opcodes.SIPUSH, value));
else
ret.add(new LdcInsnNode(value));
return ret;
}
public static InsnList makeValueEnumGetter(@SuppressWarnings("rawtypes") Enum u) {
InsnList ret = new InsnList();
Type e = Type.getType(u.getClass());
ret.add(new FieldInsnNode(Opcodes.GETSTATIC, e.getInternalName(), u.name(), e.getDescriptor()));
return ret;
}
}

View file

@ -0,0 +1,41 @@
package pro.gravit.launchserver.asm;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import java.util.ArrayList;
/**
* ClassWriter с другой реализацией метода getCommonSuperClass: при его
* использовании не происходит загрузки классов.
*/
public class SafeClassWriter extends ClassWriter {
private final ClassMetadataReader classMetadataReader;
public SafeClassWriter(ClassMetadataReader classMetadataReader, int flags) {
super(flags);
this.classMetadataReader = classMetadataReader;
}
public SafeClassWriter(ClassReader classReader, ClassMetadataReader classMetadataReader, int flags) {
super(classReader, flags);
this.classMetadataReader = classMetadataReader;
}
@Override
protected String getCommonSuperClass(String type1, String type2) {
ArrayList<String> superClasses1 = classMetadataReader.getSuperClasses(type1);
ArrayList<String> superClasses2 = classMetadataReader.getSuperClasses(type2);
int size = Math.min(superClasses1.size(), superClasses2.size());
int i;
for (i = 0; i < size && superClasses1.get(i).equals(superClasses2.get(i)); i++)
;
if (i == 0)
return "java/lang/Object";
else
return superClasses1.get(i - 1);
}
}

View file

@ -0,0 +1,45 @@
package pro.gravit.launchserver.auth;
import pro.gravit.launcher.base.events.request.AuthRequestEvent;
import java.io.IOException;
import java.io.Serial;
import java.util.List;
import java.util.stream.Collectors;
public final class AuthException extends IOException {
@Serial
private static final long serialVersionUID = -2586107832847245863L;
public AuthException(String message) {
super(message);
}
public AuthException(String message, Throwable cause) {
super(message, cause);
}
public static AuthException need2FA() {
return new AuthException(AuthRequestEvent.TWO_FACTOR_NEED_ERROR_MESSAGE);
}
public static AuthException needMFA(List<Integer> factors) {
String message = AuthRequestEvent.ONE_FACTOR_NEED_ERROR_MESSAGE_PREFIX
.concat(factors.stream().map(String::valueOf).collect(Collectors.joining(".")));
return new AuthException(message);
}
public static AuthException wrongPassword() {
return new AuthException(AuthRequestEvent.WRONG_PASSWORD_ERROR_MESSAGE);
}
public static AuthException userNotFound() {
return new AuthException(AuthRequestEvent.USER_NOT_FOUND_ERROR_MESSAGE);
}
@Override
public String toString() {
return getMessage();
}
}

View file

@ -0,0 +1,113 @@
package pro.gravit.launchserver.auth;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.launchserver.auth.mix.MixProvider;
import pro.gravit.launchserver.auth.texture.TextureProvider;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public final class AuthProviderPair {
private transient final Logger logger = LogManager.getLogger();
public boolean isDefault = true;
public AuthCoreProvider core;
public TextureProvider textureProvider;
public Map<String, MixProvider> mixes;
public Map<String, String> links;
public transient String name;
public transient Set<String> features;
public String displayName;
public boolean visible = true;
public AuthProviderPair() {
}
public AuthProviderPair(AuthCoreProvider core, TextureProvider textureProvider) {
this.core = core;
this.textureProvider = textureProvider;
}
public static Set<String> getFeatures(Class<?> clazz) {
Set<String> list = new HashSet<>();
getFeatures(clazz, list);
return list;
}
public Set<String> getFeatures() {
return features;
}
public static void getFeatures(Class<?> clazz, Set<String> list) {
Feature[] features = clazz.getAnnotationsByType(Feature.class);
for (Feature feature : features) {
list.add(feature.value());
}
Class<?> superClass = clazz.getSuperclass();
if (superClass != null && superClass != Object.class) {
getFeatures(superClass, list);
}
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> i : interfaces) {
getFeatures(i, list);
}
}
public <T> T isSupport(Class<T> clazz) {
if (core == null) return null;
T result = core.isSupport(clazz);
if (result == null && mixes != null) {
for(var m : mixes.values()) {
result = m.isSupport(clazz);
if(result != null) {
break;
}
}
}
return result;
}
public void init(LaunchServer srv, String name) {
this.name = name;
if (links != null) link(srv);
core.init(srv, this);
features = new HashSet<>();
getFeatures(core.getClass(), features);
if(mixes != null) {
for(var m : mixes.values()) {
m.init(srv, core);
getFeatures(m.getClass(), features);
}
}
}
public void link(LaunchServer srv) {
links.forEach((k, v) -> {
AuthProviderPair pair = srv.config.getAuthProviderPair(v);
if (pair == null) {
throw new NullPointerException("Auth %s link failed. Pair %s not found".formatted(name, v));
}
if ("core".equals(k)) {
if (pair.core == null)
throw new NullPointerException("Auth %s link failed. %s.core is null".formatted(name, v));
core = pair.core;
}
});
}
public void close() throws IOException {
core.close();
if (textureProvider != null) {
textureProvider.close();
}
if(mixes != null) {
for(var m : mixes.values()) {
m.close();
}
}
}
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Repeatable(Features.class)
public @interface Feature {
String value();
}

View file

@ -0,0 +1,12 @@
package pro.gravit.launchserver.auth;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Features {
Feature[] value();
}

View file

@ -0,0 +1,62 @@
package pro.gravit.launchserver.auth;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.function.Consumer;
public class HikariSQLSourceConfig implements SQLSourceConfig {
private transient volatile HikariDataSource dataSource;
private String dsClass;
private Properties dsProps;
private String driverClass;
private String jdbcUrl;
private String username;
private String password;
private boolean initializeAtStart;
public void init() {
if(initializeAtStart) {
initializeConnection();
}
}
private void initializeConnection() {
if (dataSource != null) {
return;
}
HikariConfig config = new HikariConfig();
consumeIfNotNull(config::setDataSourceClassName, dsClass);
consumeIfNotNull(config::setDataSourceProperties, dsProps);
consumeIfNotNull(config::setDriverClassName, driverClass);
consumeIfNotNull(config::setJdbcUrl, jdbcUrl);
consumeIfNotNull(config::setUsername, username);
consumeIfNotNull(config::setPassword, password);
this.dataSource = new HikariDataSource(config);
}
@Override
public Connection getConnection() throws SQLException {
if(dataSource == null && !initializeAtStart) {
synchronized (this) {
initializeConnection();
}
}
return dataSource.getConnection();
}
@Override
public void close() {
dataSource.close();
}
private static <T> void consumeIfNotNull(Consumer<T> consumer, T val) {
if (val != null) {
consumer.accept(val);
}
}
}

View file

@ -0,0 +1,127 @@
package pro.gravit.launchserver.auth;
import com.mysql.cj.jdbc.MysqlDataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.utils.helper.VerifyHelper;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import static java.util.concurrent.TimeUnit.MINUTES;
public final class MySQLSourceConfig implements AutoCloseable, SQLSourceConfig {
public static final int TIMEOUT = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.mysql.idleTimeout", Integer.toString(5000))),
VerifyHelper.POSITIVE, "launcher.mysql.idleTimeout can't be <= 5000");
private static final int MAX_POOL_SIZE = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.mysql.maxPoolSize", Integer.toString(3))),
VerifyHelper.POSITIVE, "launcher.mysql.maxPoolSize can't be <= 0");
// Instance
private transient final String poolName;
private transient final Logger logger = LogManager.getLogger();
// Config
private String address;
private int port;
private boolean useSSL;
private boolean verifyCertificates;
private String username;
private String password;
private String database;
private String timezone;
private long hikariMaxLifetime = MINUTES.toMillis(30);
private boolean useHikari;
// Cache
private transient DataSource source;
private transient boolean hikari;
public MySQLSourceConfig(String poolName) {
this.poolName = poolName;
}
public MySQLSourceConfig(String poolName, String address, int port, String username, String password, String database) {
this.poolName = poolName;
this.address = address;
this.port = port;
this.username = username;
this.password = password;
this.database = database;
}
public MySQLSourceConfig(String poolName, DataSource source, boolean hikari) {
this.poolName = poolName;
this.source = source;
this.hikari = hikari;
}
@Override
public synchronized void close() {
if (hikari)
((HikariDataSource) source).close();
}
public synchronized Connection getConnection() throws SQLException {
if (source == null) { // New data source
MysqlDataSource mysqlSource = new MysqlDataSource();
mysqlSource.setCharacterEncoding("UTF-8");
// Prep statements cache
mysqlSource.setPrepStmtCacheSize(250);
mysqlSource.setPrepStmtCacheSqlLimit(2048);
mysqlSource.setCachePrepStmts(true);
mysqlSource.setUseServerPrepStmts(true);
// General optimizations
mysqlSource.setCacheServerConfiguration(true);
mysqlSource.setUseLocalSessionState(true);
mysqlSource.setRewriteBatchedStatements(true);
mysqlSource.setMaintainTimeStats(false);
mysqlSource.setUseUnbufferedInput(false);
mysqlSource.setUseReadAheadInput(false);
mysqlSource.setUseSSL(useSSL);
mysqlSource.setVerifyServerCertificate(verifyCertificates);
// Set credentials
mysqlSource.setServerName(address);
mysqlSource.setPortNumber(port);
mysqlSource.setUser(username);
mysqlSource.setPassword(password);
mysqlSource.setDatabaseName(database);
mysqlSource.setTcpNoDelay(true);
if (timezone != null) mysqlSource.setServerTimezone(timezone);
hikari = false;
// Try using HikariCP
source = mysqlSource;
if (useHikari) {
try {
Class.forName("com.zaxxer.hikari.HikariDataSource");
hikari = true; // Used for shutdown. Not instanceof because of possible classpath error
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDataSource(mysqlSource);
hikariConfig.setPoolName(poolName);
hikariConfig.setMinimumIdle(1);
hikariConfig.setMaximumPoolSize(MAX_POOL_SIZE);
hikariConfig.setConnectionTestQuery("SELECT 1");
hikariConfig.setConnectionTimeout(1000);
hikariConfig.setLeakDetectionThreshold(2000);
hikariConfig.setMaxLifetime(hikariMaxLifetime);
// Set HikariCP pool
// Replace source with hds
source = new HikariDataSource(hikariConfig);
} catch (ClassNotFoundException ignored) {
logger.debug("HikariCP isn't in classpath for '{}'", poolName);
}
}
}
return source.getConnection();
}
}

View file

@ -0,0 +1,85 @@
package pro.gravit.launchserver.auth;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.postgresql.ds.PGSimpleDataSource;
import pro.gravit.utils.helper.VerifyHelper;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
public final class PostgreSQLSourceConfig implements AutoCloseable, SQLSourceConfig {
public static final int TIMEOUT = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.postgresql.idleTimeout", Integer.toString(5000))),
VerifyHelper.POSITIVE, "launcher.postgresql.idleTimeout can't be <= 5000");
private static final int MAX_POOL_SIZE = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.postgresql.maxPoolSize", Integer.toString(3))),
VerifyHelper.POSITIVE, "launcher.postgresql.maxPoolSize can't be <= 0");
private transient final Logger logger = LogManager.getLogger();
// Instance
private String poolName;
// Config
private String[] addresses;
private int[] ports;
private String username;
private String password;
private String database;
private long hikariMaxLifetime = MINUTES.toMillis(30); // 30 minutes
// Cache
private transient DataSource source;
private transient boolean hikari;
@Override
public synchronized void close() {
if (hikari) { // Shutdown hikari pool
((HikariDataSource) source).close();
}
}
public synchronized Connection getConnection() throws SQLException {
if (source == null) { // New data source
PGSimpleDataSource postgresqlSource = new PGSimpleDataSource();
// Set credentials
postgresqlSource.setServerNames(addresses);
postgresqlSource.setPortNumbers(ports);
postgresqlSource.setUser(username);
postgresqlSource.setPassword(password);
postgresqlSource.setDatabaseName(database);
// Try using HikariCP
source = postgresqlSource;
//noinspection Duplicates
try {
Class.forName("com.zaxxer.hikari.HikariDataSource");
hikari = true; // Used for shutdown. Not instanceof because of possible classpath error
// Set HikariCP pool
HikariDataSource hikariSource = new HikariDataSource();
hikariSource.setDataSource(source);
// Set pool settings
hikariSource.setPoolName(poolName);
hikariSource.setMinimumIdle(0);
hikariSource.setMaximumPoolSize(MAX_POOL_SIZE);
hikariSource.setIdleTimeout(SECONDS.toMillis(TIMEOUT));
hikariSource.setMaxLifetime(hikariMaxLifetime);
// Replace source with hds
source = hikariSource;
logger.info("HikariCP pooling enabled for '{}'", poolName);
} catch (ClassNotFoundException ignored) {
logger.warn("HikariCP isn't in classpath for '{}'", poolName);
}
}
return source.getConnection();
}
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth;
import java.sql.Connection;
import java.sql.SQLException;
public interface SQLSourceConfig {
Connection getConnection() throws SQLException;
void close();
}

View file

@ -0,0 +1,420 @@
package pro.gravit.launchserver.auth.core;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launcher.base.request.auth.password.AuthPlainPassword;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.MySQLSourceConfig;
import pro.gravit.launchserver.auth.SQLSourceConfig;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportSudo;
import pro.gravit.launchserver.auth.password.PasswordVerifier;
import pro.gravit.launchserver.helper.LegacySessionHelper;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Clock;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.SECONDS;
public abstract class AbstractSQLCoreProvider extends AuthCoreProvider implements AuthSupportSudo {
public final transient Logger logger = LogManager.getLogger();
public long expireSeconds = HOURS.toSeconds(1);
public String uuidColumn;
public String usernameColumn;
public String accessTokenColumn;
public String passwordColumn;
public String serverIDColumn;
public String table;
public String permissionsTable;
public String permissionsPermissionColumn;
public String permissionsUUIDColumn;
public String rolesTable;
public String rolesNameColumn;
public String rolesUUIDColumn;
public PasswordVerifier passwordVerifier;
public String customQueryByUUIDSQL;
public String customQueryByUsernameSQL;
public String customQueryByLoginSQL;
public String customQueryPermissionsByUUIDSQL;
public String customQueryRolesByUserUUID;
public String customUpdateAuthSQL;
public String customUpdateServerIdSQL;
// Prepared SQL queries
public transient String queryByUUIDSQL;
public transient String queryByUsernameSQL;
public transient String queryByLoginSQL;
public transient String queryPermissionsByUUIDSQL;
public transient String queryRolesByUserUUID;
public transient String updateAuthSQL;
public transient String updateServerIDSQL;
public abstract SQLSourceConfig getSQLConfig();
@Override
public User getUserByUsername(String username) {
try {
return queryUser(queryByUsernameSQL, username);
} catch (Exception e) {
logger.error("SQL error", e);
return null;
}
}
@Override
public User getUserByUUID(UUID uuid) {
try {
return queryUser(queryByUUIDSQL, uuid.toString());
} catch (Exception e) {
logger.error("SQL error", e);
return null;
}
}
@Override
public User getUserByLogin(String login) {
try {
return queryUser(queryByLoginSQL, login);
} catch (Exception e) {
logger.error("SQL error", e);
return null;
}
}
@Override
public UserSession getUserSessionByOAuthAccessToken(String accessToken) throws OAuthAccessTokenExpired {
try {
var info = LegacySessionHelper.getJwtInfoFromAccessToken(accessToken, server.keyAgreementManager.ecdsaPublicKey);
var user = (SQLUser) getUserByUUID(info.uuid());
if (user == null) {
return null;
}
return createSession(user);
} catch (ExpiredJwtException e) {
throw new OAuthAccessTokenExpired();
} catch (JwtException e) {
return null;
}
}
@Override
public AuthManager.AuthReport refreshAccessToken(String refreshToken, AuthResponse.AuthContext context) {
String[] parts = refreshToken.split("\\.");
if (parts.length != 2) {
return null;
}
String username = parts[0];
String token = parts[1];
var user = (SQLUser) getUserByUsername(username);
if (user == null || user.password == null) {
return null;
}
var realToken = LegacySessionHelper.makeRefreshTokenFromPassword(username, user.password, server.keyAgreementManager.legacySalt);
if (!token.equals(realToken)) {
return null;
}
var accessToken = LegacySessionHelper.makeAccessJwtTokenFromString(user, LocalDateTime.now(Clock.systemUTC()).plusSeconds(expireSeconds), server.keyAgreementManager.ecdsaPrivateKey);
return new AuthManager.AuthReport(null, accessToken, refreshToken, SECONDS.toMillis(expireSeconds), createSession(user));
}
@Override
public AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context, AuthRequest.AuthPasswordInterface password, boolean minecraftAccess) throws IOException {
SQLUser user = (SQLUser) getUserByLogin(login);
if (user == null) {
throw AuthException.userNotFound();
}
AuthPlainPassword plainPassword = (AuthPlainPassword) password;
if (plainPassword == null) {
throw AuthException.wrongPassword();
}
if (!passwordVerifier.check(user.password, plainPassword.password)) {
throw AuthException.wrongPassword();
}
SQLUserSession session = createSession(user);
var accessToken = LegacySessionHelper.makeAccessJwtTokenFromString(user, LocalDateTime.now(Clock.systemUTC()).plusSeconds(expireSeconds), server.keyAgreementManager.ecdsaPrivateKey);
var refreshToken = user.username.concat(".").concat(LegacySessionHelper.makeRefreshTokenFromPassword(user.username, user.password, server.keyAgreementManager.legacySalt));
if (minecraftAccess) {
String minecraftAccessToken = SecurityHelper.randomStringToken();
updateAuth(user, minecraftAccessToken);
return AuthManager.AuthReport.ofOAuthWithMinecraft(minecraftAccessToken, accessToken, refreshToken, SECONDS.toMillis(expireSeconds), session);
} else {
return AuthManager.AuthReport.ofOAuth(accessToken, refreshToken, SECONDS.toMillis(expireSeconds), session);
}
}
@Override
public AuthManager.AuthReport sudo(User user, boolean shadow) throws IOException {
SQLUser sqlUser = (SQLUser) user;
SQLUserSession session = createSession(sqlUser);
var accessToken = LegacySessionHelper.makeAccessJwtTokenFromString(sqlUser, LocalDateTime.now(Clock.systemUTC()).plusSeconds(expireSeconds), server.keyAgreementManager.ecdsaPrivateKey);
var refreshToken = sqlUser.username.concat(".").concat(LegacySessionHelper.makeRefreshTokenFromPassword(sqlUser.username, sqlUser.password, server.keyAgreementManager.legacySalt));
String minecraftAccessToken = SecurityHelper.randomStringToken();
updateAuth(user, minecraftAccessToken);
return AuthManager.AuthReport.ofOAuthWithMinecraft(minecraftAccessToken, accessToken, refreshToken, SECONDS.toMillis(expireSeconds), session);
}
@Override
public User checkServer(Client client, String username, String serverID) {
SQLUser user = (SQLUser) getUserByUsername(username);
if (user == null) {
return null;
}
if (user.getUsername().equals(username) && user.getServerId().equals(serverID)) {
return user;
}
return null;
}
@Override
public boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) throws IOException {
SQLUser user = (SQLUser) client.getUser();
if (user == null) return false;
return (uuid == null ? user.getUsername().equals(username) : user.getUUID().equals(uuid)) && user.getAccessToken().equals(accessToken) && updateServerID(user, serverID);
}
@Override
public void init(LaunchServer server, AuthProviderPair pair) {
super.init(server, pair);
if (getSQLConfig() == null) logger.error("SQLHolder cannot be null");
if (uuidColumn == null) logger.error("uuidColumn cannot be null");
if (usernameColumn == null) logger.error("usernameColumn cannot be null");
if (accessTokenColumn == null) logger.error("accessTokenColumn cannot be null");
if (serverIDColumn == null) logger.error("serverIDColumn cannot be null");
if (table == null) logger.error("table cannot be null");
// Prepare SQL queries
String userInfoCols = makeUserCols();
queryByUUIDSQL = customQueryByUUIDSQL != null ? customQueryByUUIDSQL :
"SELECT %s FROM %s WHERE %s=? LIMIT 1".formatted(userInfoCols, table, uuidColumn);
queryByUsernameSQL = customQueryByUsernameSQL != null ? customQueryByUsernameSQL :
"SELECT %s FROM %s WHERE %s=? LIMIT 1".formatted(userInfoCols, table, usernameColumn);
queryByLoginSQL = customQueryByLoginSQL != null ? customQueryByLoginSQL : queryByUsernameSQL;
updateAuthSQL = customUpdateAuthSQL != null ? customUpdateAuthSQL :
"UPDATE %s SET %s=?, %s=NULL WHERE %s=?".formatted(table, accessTokenColumn, serverIDColumn, uuidColumn);
updateServerIDSQL = customUpdateServerIdSQL != null ? customUpdateServerIdSQL :
"UPDATE %s SET %s=? WHERE %s=?".formatted(table, serverIDColumn, uuidColumn);
if (isEnabledPermissions()) {
if(isEnabledRoles()) {
queryPermissionsByUUIDSQL = customQueryPermissionsByUUIDSQL != null ? customQueryPermissionsByUUIDSQL :
"WITH RECURSIVE req AS (\n" +
"SELECT p."+permissionsPermissionColumn+" FROM "+permissionsTable+" p WHERE p."+permissionsUUIDColumn+" = ?\n" +
"UNION ALL\n" +
"SELECT p."+permissionsPermissionColumn+" FROM "+permissionsTable+" p\n" +
"INNER JOIN "+rolesTable+" r ON p."+permissionsUUIDColumn+" = r."+rolesUUIDColumn+"\n" +
"INNER JOIN req ON r."+rolesUUIDColumn+"=substring(req."+permissionsPermissionColumn+" from 6) or r.name=substring(req."+permissionsPermissionColumn+" from 6)\n" +
") SELECT * FROM req";
queryRolesByUserUUID = customQueryRolesByUserUUID != null ? customQueryRolesByUserUUID : "SELECT r." + rolesNameColumn + " FROM " + rolesTable + " r\n" +
"INNER JOIN " + permissionsTable + " pr ON r." + rolesUUIDColumn + "=substring(pr." + permissionsPermissionColumn + " from 6) or r." + rolesNameColumn + "=substring(pr." + permissionsPermissionColumn + " from 6)\n" +
"WHERE pr." + permissionsUUIDColumn + " = ?";
} else {
queryPermissionsByUUIDSQL = customQueryPermissionsByUUIDSQL != null ? customQueryPermissionsByUUIDSQL :
"SELECT (%s) FROM %s WHERE %s=?".formatted(permissionsPermissionColumn, permissionsTable, permissionsUUIDColumn);
}
}
}
protected String makeUserCols() {
return "%s, %s, %s, %s, %s".formatted(uuidColumn, usernameColumn, accessTokenColumn, serverIDColumn, passwordColumn);
}
protected void updateAuth(User user, String accessToken) throws IOException {
try (Connection c = getSQLConfig().getConnection()) {
SQLUser SQLUser = (SQLUser) user;
SQLUser.accessToken = accessToken;
PreparedStatement s = c.prepareStatement(updateAuthSQL);
s.setString(1, accessToken);
s.setString(2, user.getUUID().toString());
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
s.executeUpdate();
} catch (SQLException e) {
throw new IOException(e);
}
}
protected boolean updateServerID(User user, String serverID) throws IOException {
try (Connection c = getSQLConfig().getConnection()) {
SQLUser SQLUser = (SQLUser) user;
SQLUser.serverId = serverID;
PreparedStatement s = c.prepareStatement(updateServerIDSQL);
s.setString(1, serverID);
s.setString(2, user.getUUID().toString());
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
return s.executeUpdate() > 0;
} catch (SQLException e) {
throw new IOException(e);
}
}
@Override
public void close() {
getSQLConfig().close();
}
protected SQLUser constructUser(ResultSet set) throws SQLException {
return set.next() ? new SQLUser(UUID.fromString(set.getString(uuidColumn)), set.getString(usernameColumn),
set.getString(accessTokenColumn), set.getString(serverIDColumn), set.getString(passwordColumn)) : null;
}
public ClientPermissions requestPermissions (String uuid) throws SQLException
{
return new ClientPermissions(isEnabledRoles() ? queryRolesNames(queryRolesByUserUUID,uuid) : new ArrayList<>(),
isEnabledPermissions() ? queryPermissions(queryPermissionsByUUIDSQL,uuid) : new ArrayList<>());
}
private SQLUser queryUser(String sql, String value) throws SQLException {
SQLUser user;
try (Connection c = getSQLConfig().getConnection()) {
PreparedStatement s = c.prepareStatement(sql);
s.setString(1, value);
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
try (ResultSet set = s.executeQuery()) {
user = constructUser(set);
}
}
if(user != null) {
user.permissions = requestPermissions(user.uuid.toString());
}
return user;
}
private List<String> queryPermissions(String sql, String value) throws SQLException {
try (Connection c = getSQLConfig().getConnection()) {
PreparedStatement s = c.prepareStatement(sql);
s.setString(1, value);
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
ResultSet set = s.executeQuery();
List<String> perms = new ArrayList<>();
while (set.next())
perms.add(set.getString(permissionsPermissionColumn));
return perms;
}
}
protected SQLUserSession createSession(SQLUser user) {
return new SQLUserSession(user);
}
public boolean isEnabledPermissions() {
return permissionsPermissionColumn != null;
}
public boolean isEnabledRoles() {
return rolesNameColumn != null;
}
private List<String> queryRolesNames(String sql, String value) throws SQLException {
try (Connection c = getSQLConfig().getConnection()) {
PreparedStatement s = c.prepareStatement(sql);
s.setString(1, value);
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
ResultSet set = s.executeQuery();
List<String> perms = new ArrayList<>();
while (set.next())
perms.add(set.getString(rolesNameColumn));
return perms;
}
}
public static class SQLUser implements User {
protected final UUID uuid;
protected final String username;
protected String accessToken;
protected String serverId;
protected final String password;
protected ClientPermissions permissions;
public SQLUser(UUID uuid, String username, String accessToken, String serverId, String password) {
this.uuid = uuid;
this.username = username;
this.accessToken = accessToken;
this.serverId = serverId;
this.password = password;
}
@Override
public String getUsername() {
return username;
}
@Override
public UUID getUUID() {
return uuid;
}
public String getServerId() {
return serverId;
}
public String getAccessToken() {
return accessToken;
}
@Override
public ClientPermissions getPermissions() {
return permissions;
}
@Override
public String toString() {
return "SQLUser{" +
"uuid=" + uuid +
", username='" + username + '\'' +
", permissions=" + permissions +
'}';
}
}
public static class SQLUserSession implements UserSession {
private final SQLUser user;
private final String id;
public SQLUserSession(SQLUser user) {
this.user = user;
this.id = user.username;
}
@Override
public String getID() {
return id;
}
@Override
public User getUser() {
return user;
}
@Override
public String getMinecraftAccessToken() {
return user.getAccessToken();
}
@Override
public long getExpireIn() {
return 0;
}
}
}

View file

@ -0,0 +1,414 @@
package pro.gravit.launchserver.auth.core;
import com.google.gson.reflect.TypeToken;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.base.events.RequestEvent;
import pro.gravit.launcher.base.events.request.AuthRequestEvent;
import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.base.profiles.PlayerProfile;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launcher.base.request.auth.details.AuthPasswordDetails;
import pro.gravit.launcher.base.request.auth.password.AuthPlainPassword;
import pro.gravit.launcher.base.request.secure.HardwareReportRequest;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.Reconfigurable;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportGetAllUsers;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportHardware;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportRegistration;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportSudo;
import pro.gravit.launchserver.auth.core.openid.OpenIDAuthCoreProvider;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import pro.gravit.utils.ProviderMap;
import pro.gravit.utils.command.Command;
import pro.gravit.utils.command.SubCommand;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
/*
All-In-One provider
*/
public abstract class AuthCoreProvider implements AutoCloseable, Reconfigurable {
public static final ProviderMap<AuthCoreProvider> providers = new ProviderMap<>("AuthCoreProvider");
private static final Logger logger = LogManager.getLogger();
private static boolean registredProviders = false;
protected transient LaunchServer server;
protected transient AuthProviderPair pair;
public static void registerProviders() {
if (!registredProviders) {
providers.register("reject", RejectAuthCoreProvider.class);
providers.register("mysql", MySQLCoreProvider.class);
providers.register("postgresql", PostgresSQLCoreProvider.class);
providers.register("memory", MemoryAuthCoreProvider.class);
providers.register("merge", MergeAuthCoreProvider.class);
providers.register("openid", OpenIDAuthCoreProvider.class);
providers.register("sql", SQLCoreProvider.class);
registredProviders = true;
}
}
public abstract User getUserByUsername(String username);
public User getUserByLogin(String login) {
return getUserByUsername(login);
}
public abstract User getUserByUUID(UUID uuid);
public abstract UserSession getUserSessionByOAuthAccessToken(String accessToken) throws OAuthAccessTokenExpired;
public abstract AuthManager.AuthReport refreshAccessToken(String refreshToken, AuthResponse.AuthContext context /* may be null */);
public void verifyAuth(AuthResponse.AuthContext context) throws AuthException {
// None
}
public abstract AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context /* may be null */, AuthRequest.AuthPasswordInterface password /* may be null */, boolean minecraftAccess) throws IOException;
public AuthManager.AuthReport authorize(User user, AuthResponse.AuthContext context /* may be null */, AuthRequest.AuthPasswordInterface password /* may be null */, boolean minecraftAccess) throws IOException {
return authorize(user.getUsername(), context, password, minecraftAccess);
}
public void init(LaunchServer server, AuthProviderPair pair) {
this.server = server;
this.pair = pair;
}
public List<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> getDetails(Client client) {
return List.of(new AuthPasswordDetails());
}
@Override
public Map<String, Command> getCommands() {
Map<String, Command> map = defaultCommandsMap();
map.put("auth", new SubCommand("[login] (json/plain password data)", "Test auth") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
AuthRequest.AuthPasswordInterface password = null;
if (args.length > 1) {
if (args[1].startsWith("{")) {
password = Launcher.gsonManager.gson.fromJson(args[1], AuthRequest.AuthPasswordInterface.class);
} else {
password = new AuthPlainPassword(args[1]);
}
}
var report = authorize(args[0], null, password, false);
if (report.isUsingOAuth()) {
logger.info("OAuth: AccessToken: {} RefreshToken: {} MinecraftAccessToken: {}", report.oauthAccessToken(), report.oauthRefreshToken(), report.minecraftAccessToken());
if (report.session() != null) {
logger.info("UserSession: id {} expire {} user {}", report.session().getID(), report.session().getExpireIn(), report.session().getUser() == null ? "null" : "found");
logger.info(report.session().toString());
}
} else {
logger.info("Basic: MinecraftAccessToken: {}", report.minecraftAccessToken());
}
}
});
map.put("getuserbyusername", new SubCommand("[username]", "get user by username") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
User user = getUserByUsername(args[0]);
if (user == null) {
logger.info("User {} not found", args[0]);
} else {
logger.info("User {}: {}", args[0], user.toString());
}
}
});
map.put("getuserbyuuid", new SubCommand("[uuid]", "get user by uuid") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
User user = getUserByUUID(UUID.fromString(args[0]));
if (user == null) {
logger.info("User {} not found", args[0]);
} else {
logger.info("User {}: {}", args[0], user.toString());
}
}
});
{
var instance = isSupport(AuthSupportGetAllUsers.class);
if (instance != null) {
map.put("getallusers", new SubCommand("(limit)", "print all users information") {
@Override
public void invoke(String... args) {
int max = Integer.MAX_VALUE;
if (args.length > 0) max = Integer.parseInt(args[0]);
Iterable<User> users = instance.getAllUsers();
int counter = 0;
for (User u : users) {
logger.info("User {}", u.toString());
counter++;
if (counter == max) break;
}
logger.info("Found {} users", counter);
}
});
}
}
{
var instance = isSupport(AuthSupportHardware.class);
if (instance != null) {
map.put("gethardwarebyid", new SubCommand("[id]", "get hardware by id") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
UserHardware hardware = instance.getHardwareInfoById(args[0]);
if (hardware == null) {
logger.info("UserHardware {} not found", args[0]);
} else {
logger.info("UserHardware: {}", hardware);
}
}
});
map.put("gethardwarebydata", new SubCommand("[json data]", "fulltext search hardware by json data(slow)") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
UserHardware hardware = instance.getHardwareInfoByData(Launcher.gsonManager.gson.fromJson(args[0], HardwareReportRequest.HardwareInfo.class));
if (hardware == null) {
logger.info("UserHardware {} not found", args[0]);
} else {
logger.info("UserHardware: {}", hardware);
}
}
});
map.put("findmulti", new SubCommand("[hardware id]", "get all users in one hardware id") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
UserHardware hardware = instance.getHardwareInfoById(args[0]);
if (hardware == null) {
logger.info("UserHardware {} not found", args[0]);
return;
}
Iterable<User> users = instance.getUsersByHardwareInfo(hardware);
for (User user : users) {
logger.info("User {}", user);
}
}
});
map.put("banhardware", new SubCommand("[hardware id]", "ban hardware by id") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
UserHardware hardware = instance.getHardwareInfoById(args[0]);
if (hardware == null) {
logger.info("UserHardware {} not found", args[0]);
return;
}
instance.banHardware(hardware);
logger.info("UserHardware {} banned", args[0]);
}
});
map.put("unbanhardware", new SubCommand("[hardware id]", "ban hardware by id") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 1);
UserHardware hardware = instance.getHardwareInfoById(args[0]);
if (hardware == null) {
logger.info("UserHardware {} not found", args[0]);
return;
}
instance.unbanHardware(hardware);
logger.info("UserHardware {} unbanned", args[0]);
}
});
map.put("comparehardware", new SubCommand("[json data 1] [json data 2]", "compare hardware info") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 2);
HardwareReportRequest.HardwareInfo hardware1 = Launcher.gsonManager.gson.fromJson(args[0], HardwareReportRequest.HardwareInfo.class);
HardwareReportRequest.HardwareInfo hardware2 = Launcher.gsonManager.gson.fromJson(args[1], HardwareReportRequest.HardwareInfo.class);
AuthSupportHardware.HardwareInfoCompareResult result = instance.compareHardwareInfo(hardware1, hardware2);
if (result == null) {
logger.error("Method compareHardwareInfo return null");
return;
}
logger.info("Compare result: {} Spoof: {} first {} second", result.compareLevel, result.firstSpoofingLevel, result.secondSpoofingLevel);
}
});
}
}
{
var instance = isSupport(AuthSupportRegistration.class);
if (instance != null) {
map.put("register", new SubCommand("[username] [email] [plain or json password] (json args)", "Register new user") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 2);
Map<String, String> map = null;
String username = args[0];
String email = args[1];
String plainPassword = args[2];
if (args.length > 3) {
Type typeOfMap = new TypeToken<Map<String, String>>() {
}.getType();
map = Launcher.gsonManager.gson.fromJson(args[2], typeOfMap);
}
AuthRequest.AuthPasswordInterface password;
if (plainPassword.startsWith("{")) {
password = Launcher.gsonManager.gson.fromJson(plainPassword, AuthRequest.AuthPasswordInterface.class);
} else {
password = new AuthPlainPassword(plainPassword);
}
User user = instance.registration(username, email, password, map);
logger.info("User '{}' registered", user.toString());
}
});
}
}
{
var instance = isSupport(AuthSupportSudo.class);
if(instance != null) {
map.put("sudo", new SubCommand("[connectUUID] [username/uuid] [isShadow] (CLIENT/API)", "Authorize connectUUID as another user without password") {
@Override
public void invoke(String... args) throws Exception {
verifyArgs(args, 3);
UUID connectUUID = UUID.fromString(args[0]);
String login = args[1];
boolean isShadow = Boolean.parseBoolean(args[2]);
AuthResponse.ConnectTypes type;
if(args.length > 3) {
type = AuthResponse.ConnectTypes.valueOf(args[3]);
} else {
type = AuthResponse.ConnectTypes.CLIENT;
}
User user;
if(login.length() == 36) {
UUID uuid = UUID.fromString(login);
user = getUserByUUID(uuid);
} else {
user = getUserByUsername(login);
}
if(user == null) {
logger.error("User {} not found", login);
return;
}
AtomicBoolean founded = new AtomicBoolean();
server.nettyServerSocketHandler.nettyServer.service.forEachActiveChannels((ch, fh) -> {
var client = fh.getClient();
if(client == null || !connectUUID.equals(fh.getConnectUUID())) {
return;
}
logger.info("Found connectUUID {} with IP {}", fh.getConnectUUID(), fh.context == null ? "null" : fh.context.ip);
var lock = server.config.netty.performance.disableThreadSafeClientObject ? null : client.writeLock();
if(lock != null) {
lock.lock();
}
try {
var report = instance.sudo(user, isShadow);
User user1 = report.session().getUser();
server.authManager.internalAuth(client, type, pair, user1.getUsername(), user1.getUUID(), user1.getPermissions(), true);
client.sessionObject = report.session();
client.coreObject = report.session().getUser();
PlayerProfile playerProfile = server.authManager.getPlayerProfile(client);
AuthRequestEvent request = new AuthRequestEvent(user1.getPermissions(), playerProfile,
report.minecraftAccessToken(), null, null,
new AuthRequestEvent.OAuthRequestEvent(report.oauthAccessToken(), report.oauthRefreshToken(), report.oauthExpire()));
request.requestUUID = RequestEvent.eventUUID;
server.nettyServerSocketHandler.nettyServer.service.sendObject(ch, request);
} catch (Throwable e) {
logger.error("Sudo error", e);
} finally {
if(lock != null) {
lock.unlock();
}
founded.set(true);
}
});
if(!founded.get()) {
logger.error("ConnectUUID {} not found", connectUUID);
}
}
});
}
}
return map;
}
public abstract User checkServer(Client client, String username, String serverID) throws IOException;
public abstract boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) throws IOException;
@SuppressWarnings("unchecked")
public <T> T isSupport(Class<T> clazz) {
if (clazz.isAssignableFrom(getClass())) return (T) this;
return null;
}
@Override
public abstract void close();
public static class PasswordVerifyReport {
public static final PasswordVerifyReport REQUIRED_2FA = new PasswordVerifyReport(-1);
public static final PasswordVerifyReport FAILED = new PasswordVerifyReport(false);
public static final PasswordVerifyReport OK = new PasswordVerifyReport(true);
public final boolean success;
public final boolean needMoreFactors;
public final List<Integer> factors;
public PasswordVerifyReport(boolean success) {
this.success = success;
this.needMoreFactors = false;
this.factors = List.of();
}
public PasswordVerifyReport(AuthManager.AuthReport report) {
this.success = true;
this.needMoreFactors = false;
this.factors = List.of();
}
public PasswordVerifyReport(int nextFactor) {
this.success = false;
this.needMoreFactors = true;
this.factors = List.of(nextFactor);
}
public PasswordVerifyReport(List<Integer> factors) {
this.success = false;
this.needMoreFactors = false;
this.factors = Collections.unmodifiableList(factors);
}
private PasswordVerifyReport(boolean success, boolean needMoreFactors, List<Integer> factors) {
this.success = success;
this.needMoreFactors = needMoreFactors;
this.factors = factors;
}
public boolean isSuccess() {
return success;
}
}
public static class OAuthAccessTokenExpired extends Exception {
public OAuthAccessTokenExpired() {
}
public OAuthAccessTokenExpired(String message) {
super(message);
}
public OAuthAccessTokenExpired(String message, Throwable cause) {
super(message, cause);
}
}
}

View file

@ -0,0 +1,204 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launcher.base.request.auth.details.AuthLoginOnlyDetails;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportSudo;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
public class MemoryAuthCoreProvider extends AuthCoreProvider implements AuthSupportSudo {
private transient final List<MemoryUser> memory = new ArrayList<>(16);
@Override
public User getUserByUsername(String username) {
synchronized (memory) {
for (MemoryUser u : memory) {
if (u.username.equals(username)) {
return u;
}
}
var result = new MemoryUser(username);
memory.add(result);
return result;
}
}
@Override
public List<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> getDetails(Client client) {
return List.of(new AuthLoginOnlyDetails());
}
@Override
public User getUserByUUID(UUID uuid) {
synchronized (memory) {
for (MemoryUser u : memory) {
if (u.uuid.equals(uuid)) {
return u;
}
}
}
return null;
}
@Override
public UserSession getUserSessionByOAuthAccessToken(String accessToken) {
synchronized (memory) {
for (MemoryUser u : memory) {
if (u.accessToken.equals(accessToken)) {
return new MemoryUserSession(u);
}
}
}
return null;
}
@Override
public AuthManager.AuthReport refreshAccessToken(String refreshToken, AuthResponse.AuthContext context) {
return null;
}
@Override
public AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context, AuthRequest.AuthPasswordInterface password, boolean minecraftAccess) throws IOException {
if (login == null) {
throw AuthException.userNotFound();
}
MemoryUser user = null;
synchronized (memory) {
for (MemoryUser u : memory) {
if (u.username.equals(login)) {
user = u;
break;
}
}
if (user == null) {
user = new MemoryUser(login);
memory.add(user);
}
}
if (!minecraftAccess) {
return AuthManager.AuthReport.ofOAuth(user.accessToken, null, 0, new MemoryUserSession(user));
} else {
return AuthManager.AuthReport.ofOAuthWithMinecraft(user.accessToken, user.accessToken, null, 0, new MemoryUserSession(user));
}
}
@Override
public User checkServer(Client client, String username, String serverID) {
synchronized (memory) {
for (MemoryUser u : memory) {
if (u.username.equals(username)) {
return u;
}
}
var result = new MemoryUser(username);
memory.add(result);
return result;
}
}
@Override
public boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) {
return true;
}
@Override
public void close() {
}
@Override
public AuthManager.AuthReport sudo(User user, boolean shadow) throws IOException {
return authorize(user.getUsername(), null, null, true);
}
public static class MemoryUser implements User {
private final String username;
private final UUID uuid;
private String serverId;
private final String accessToken;
private final ClientPermissions permissions;
public MemoryUser(String username) {
this.username = username;
this.uuid = makeUuidFromUsername(username);
this.accessToken = SecurityHelper.randomStringToken();
this.permissions = new ClientPermissions();
}
private static UUID makeUuidFromUsername(String username) {
return UUID.nameUUIDFromBytes(username.getBytes(StandardCharsets.UTF_8));
}
@Override
public String getUsername() {
return username;
}
@Override
public UUID getUUID() {
return uuid;
}
@Override
public ClientPermissions getPermissions() {
return permissions;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MemoryUser that = (MemoryUser) o;
return uuid.equals(that.uuid);
}
@Override
public int hashCode() {
return Objects.hash(uuid);
}
}
public static class MemoryUserSession implements UserSession {
private final String id;
private final MemoryUser user;
private final long expireIn;
public MemoryUserSession(MemoryUser user) {
this.id = SecurityHelper.randomStringToken();
this.user = user;
this.expireIn = 0;
}
@Override
public String getID() {
return id;
}
@Override
public User getUser() {
return user;
}
@Override
public String getMinecraftAccessToken() {
return "IGNORED";
}
@Override
public long getExpireIn() {
return expireIn;
}
}
}

View file

@ -0,0 +1,91 @@
package pro.gravit.launchserver.auth.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class MergeAuthCoreProvider extends AuthCoreProvider {
private transient final Logger logger = LogManager.getLogger(MergeAuthCoreProvider.class);
public List<String> list = new ArrayList<>();
private final transient List<AuthCoreProvider> providers = new ArrayList<>();
@Override
public User getUserByUsername(String username) {
for(var core : providers) {
var result = core.getUserByUsername(username);
if(result != null) {
return result;
}
}
return null;
}
@Override
public User getUserByUUID(UUID uuid) {
for(var core : providers) {
var result = core.getUserByUUID(uuid);
if(result != null) {
return result;
}
}
return null;
}
@Override
public UserSession getUserSessionByOAuthAccessToken(String accessToken) throws OAuthAccessTokenExpired {
throw new OAuthAccessTokenExpired(); // Authorization not supported
}
@Override
public AuthManager.AuthReport refreshAccessToken(String refreshToken, AuthResponse.AuthContext context) {
return null;
}
@Override
public AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context, AuthRequest.AuthPasswordInterface password, boolean minecraftAccess) throws IOException {
throw new AuthException("Authorization not supported");
}
@Override
public User checkServer(Client client, String username, String serverID) throws IOException {
for(var core : providers) {
var result = core.checkServer(client, username, serverID);
if(result != null) {
return result;
}
}
return null;
}
@Override
public boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) {
return false; // Authorization not supported
}
@Override
public void init(LaunchServer server, AuthProviderPair pair1) {
for(var e : list) {
var pair = server.config.auth.get(e);
if(pair != null) {
providers.add(pair.core);
} else {
logger.warn("Provider {} not found", e);
}
}
}
@Override
public void close() {
// Providers closed automatically
}
}

View file

@ -0,0 +1,354 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launcher.base.request.secure.HardwareReportRequest;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.MySQLSourceConfig;
import pro.gravit.launchserver.auth.SQLSourceConfig;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportHardware;
import pro.gravit.launchserver.auth.core.interfaces.session.UserSessionSupportHardware;
import pro.gravit.utils.helper.IOHelper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Base64;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
public class MySQLCoreProvider extends AbstractSQLCoreProvider implements AuthSupportHardware {
public MySQLSourceConfig mySQLHolder;
public String hardwareIdColumn;
public String tableHWID = "hwids";
public String tableHWIDLog = "hwidLog";
public double criticalCompareLevel = 1.0;
private transient String sqlFindHardwareByPublicKey;
private transient String sqlFindHardwareByData;
private transient String sqlFindHardwareById;
private transient String sqlCreateHardware;
private transient String sqlCreateHWIDLog;
private transient String sqlUpdateHardwarePublicKey;
private transient String sqlUpdateHardwareBanned;
private transient String sqlUpdateUsers;
private transient String sqlUsersByHwidId;
@Override
public SQLSourceConfig getSQLConfig() {
return mySQLHolder;
}
@Override
public void init(LaunchServer server, AuthProviderPair pair) {
super.init(server, pair);
logger.warn("Method 'mysql' deprecated and may be removed in future release. Please use new 'sql' method: https://gravitlauncher.com/auth");
String userInfoCols = makeUserCols();
String hardwareInfoCols = "id, hwDiskId, baseboardSerialNumber, displayId, bitness, totalMemory, logicalProcessors, physicalProcessors, processorMaxFreq, battery, id, graphicCard, banned, publicKey";
if (sqlFindHardwareByPublicKey == null)
sqlFindHardwareByPublicKey = "SELECT %s FROM %s WHERE `publicKey` = ?".formatted(hardwareInfoCols, tableHWID);
if (sqlFindHardwareById == null)
sqlFindHardwareById = "SELECT %s FROM %s WHERE `id` = ?".formatted(hardwareInfoCols, tableHWID);
if (sqlUsersByHwidId == null)
sqlUsersByHwidId = "SELECT %s FROM %s WHERE `%s` = ?".formatted(userInfoCols, table, hardwareIdColumn);
if (sqlFindHardwareByData == null)
sqlFindHardwareByData = "SELECT %s FROM %s".formatted(hardwareInfoCols, tableHWID);
if (sqlCreateHardware == null)
sqlCreateHardware = "INSERT INTO `%s` (`publickey`, `hwDiskId`, `baseboardSerialNumber`, `displayId`, `bitness`, `totalMemory`, `logicalProcessors`, `physicalProcessors`, `processorMaxFreq`, `graphicCard`, `battery`, `banned`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '0')".formatted(tableHWID);
if (sqlCreateHWIDLog == null)
sqlCreateHWIDLog = "INSERT INTO %s (`hwidId`, `newPublicKey`) VALUES (?, ?)".formatted(tableHWIDLog);
if (sqlUpdateHardwarePublicKey == null)
sqlUpdateHardwarePublicKey = "UPDATE %s SET `publicKey` = ? WHERE `id` = ?".formatted(tableHWID);
sqlUpdateHardwareBanned = "UPDATE %s SET `banned` = ? WHERE `id` = ?".formatted(tableHWID);
sqlUpdateUsers = "UPDATE %s SET `%s` = ? WHERE `%s` = ?".formatted(table, hardwareIdColumn, uuidColumn);
}
@Override
protected String makeUserCols() {
return super.makeUserCols().concat(", ").concat(hardwareIdColumn);
}
@Override
protected MySQLUser constructUser(ResultSet set) throws SQLException {
return set.next() ? new MySQLUser(UUID.fromString(set.getString(uuidColumn)), set.getString(usernameColumn),
set.getString(accessTokenColumn), set.getString(serverIDColumn), set.getString(passwordColumn), set.getLong(hardwareIdColumn)) : null;
}
private MySQLUserHardware fetchHardwareInfo(ResultSet set) throws SQLException, IOException {
HardwareReportRequest.HardwareInfo hardwareInfo = new HardwareReportRequest.HardwareInfo();
hardwareInfo.hwDiskId = set.getString("hwDiskId");
hardwareInfo.baseboardSerialNumber = set.getString("baseboardSerialNumber");
Blob displayId = set.getBlob("displayId");
hardwareInfo.displayId = displayId == null ? null : IOHelper.read(displayId.getBinaryStream());
hardwareInfo.bitness = set.getInt("bitness");
hardwareInfo.totalMemory = set.getLong("totalMemory");
hardwareInfo.logicalProcessors = set.getInt("logicalProcessors");
hardwareInfo.physicalProcessors = set.getInt("physicalProcessors");
hardwareInfo.processorMaxFreq = set.getLong("processorMaxFreq");
hardwareInfo.battery = set.getBoolean("battery");
hardwareInfo.graphicCard = set.getString("graphicCard");
Blob publicKey = set.getBlob("publicKey");
long id = set.getLong("id");
boolean banned = set.getBoolean("banned");
return new MySQLUserHardware(hardwareInfo, publicKey == null ? null : IOHelper.read(publicKey.getBinaryStream()), id, banned);
}
private void setUserHardwareId(Connection connection, UUID uuid, long hwidId) throws SQLException {
PreparedStatement s = connection.prepareStatement(sqlUpdateUsers);
s.setLong(1, hwidId);
s.setString(2, uuid.toString());
s.executeUpdate();
}
@Override
public UserHardware getHardwareInfoByPublicKey(byte[] publicKey) {
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlFindHardwareByPublicKey);
s.setBlob(1, new ByteArrayInputStream(publicKey));
try (ResultSet set = s.executeQuery()) {
if (set.next()) {
return fetchHardwareInfo(set);
} else {
return null;
}
}
} catch (SQLException | IOException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public UserHardware getHardwareInfoByData(HardwareReportRequest.HardwareInfo info) {
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlFindHardwareByData);
try (ResultSet set = s.executeQuery()) {
while (set.next()) {
MySQLUserHardware hw = fetchHardwareInfo(set);
HardwareInfoCompareResult result = compareHardwareInfo(hw.getHardwareInfo(), info);
if (result.compareLevel > criticalCompareLevel) {
return hw;
}
}
}
} catch (SQLException | IOException throwables) {
logger.error("SQL Error", throwables);
}
return null;
}
@Override
public UserHardware getHardwareInfoById(String id) {
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlFindHardwareById);
s.setLong(1, Long.parseLong(id));
try (ResultSet set = s.executeQuery()) {
if (set.next()) {
return fetchHardwareInfo(set);
} else {
return null;
}
}
} catch (SQLException | IOException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public UserHardware createHardwareInfo(HardwareReportRequest.HardwareInfo hardwareInfo, byte[] publicKey) {
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlCreateHardware, Statement.RETURN_GENERATED_KEYS);
s.setBlob(1, new ByteArrayInputStream(publicKey));
s.setString(2, hardwareInfo.hwDiskId);
s.setString(3, hardwareInfo.baseboardSerialNumber);
s.setBlob(4, hardwareInfo.displayId == null ? null : new ByteArrayInputStream(hardwareInfo.displayId));
s.setInt(5, hardwareInfo.bitness);
s.setLong(6, hardwareInfo.totalMemory);
s.setInt(7, hardwareInfo.logicalProcessors);
s.setInt(8, hardwareInfo.physicalProcessors);
s.setLong(9, hardwareInfo.processorMaxFreq);
s.setString(10, hardwareInfo.graphicCard);
s.setBoolean(11, hardwareInfo.battery);
s.executeUpdate();
try (ResultSet generatedKeys = s.getGeneratedKeys()) {
if (generatedKeys.next()) {
//writeHwidLog(connection, generatedKeys.getLong(1), publicKey);
long id = generatedKeys.getLong(1);
return new MySQLUserHardware(hardwareInfo, publicKey, id, false);
}
}
return null;
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public void connectUserAndHardware(UserSession userSession, UserHardware hardware) {
SQLUserSession mySQLUserSession = (SQLUserSession) userSession;
MySQLUser mySQLUser = (MySQLUser) mySQLUserSession.getUser();
MySQLUserHardware mySQLUserHardware = (MySQLUserHardware) hardware;
if (mySQLUser.hwidId == mySQLUserHardware.id) return;
mySQLUser.hwidId = mySQLUserHardware.id;
try (Connection connection = mySQLHolder.getConnection()) {
setUserHardwareId(connection, mySQLUser.getUUID(), mySQLUserHardware.id);
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
}
}
@Override
public void addPublicKeyToHardwareInfo(UserHardware hardware, byte[] publicKey) {
MySQLUserHardware mySQLUserHardware = (MySQLUserHardware) hardware;
mySQLUserHardware.publicKey = publicKey;
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwarePublicKey);
s.setBlob(1, new ByteArrayInputStream(publicKey));
s.setLong(2, mySQLUserHardware.id);
s.executeUpdate();
} catch (SQLException e) {
logger.error("SQL error", e);
}
}
@Override
public Iterable<User> getUsersByHardwareInfo(UserHardware hardware) {
List<User> users = new LinkedList<>();
try (Connection c = mySQLHolder.getConnection()) {
PreparedStatement s = c.prepareStatement(sqlUsersByHwidId);
s.setLong(1, Long.parseLong(hardware.getId()));
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
try (ResultSet set = s.executeQuery()) {
while (!set.isLast()) {
users.add(constructUser(set));
}
}
} catch (SQLException e) {
logger.error("SQL error", e);
return null;
}
return users;
}
@Override
public void banHardware(UserHardware hardware) {
MySQLUserHardware mySQLUserHardware = (MySQLUserHardware) hardware;
mySQLUserHardware.banned = true;
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwareBanned);
s.setBoolean(1, true);
s.setLong(2, mySQLUserHardware.id);
s.executeUpdate();
} catch (SQLException e) {
logger.error("SQL Error", e);
}
}
@Override
public void unbanHardware(UserHardware hardware) {
MySQLUserHardware mySQLUserHardware = (MySQLUserHardware) hardware;
mySQLUserHardware.banned = false;
try (Connection connection = mySQLHolder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwareBanned);
s.setBoolean(1, false);
s.setLong(2, mySQLUserHardware.id);
s.executeUpdate();
} catch (SQLException e) {
logger.error("SQL error", e);
}
}
@Override
protected SQLUserSession createSession(SQLUser user) {
return new MySQLUserSession(user);
}
public class MySQLUserSession extends SQLUserSession implements UserSessionSupportHardware {
private transient MySQLUser mySQLUser;
protected transient MySQLUserHardware hardware;
public MySQLUserSession(SQLUser user) {
super(user);
mySQLUser = (MySQLUser) user;
}
@Override
public String getHardwareId() {
return mySQLUser.hwidId == 0 ? null : String.valueOf(mySQLUser.hwidId);
}
@Override
public UserHardware getHardware() {
if(hardware == null) {
hardware = (MySQLUserHardware) getHardwareInfoById(String.valueOf(mySQLUser.hwidId));
}
return hardware;
}
}
public static class MySQLUserHardware implements UserHardware {
private final HardwareReportRequest.HardwareInfo hardwareInfo;
private final long id;
private byte[] publicKey;
private boolean banned;
public MySQLUserHardware(HardwareReportRequest.HardwareInfo hardwareInfo, byte[] publicKey, long id, boolean banned) {
this.hardwareInfo = hardwareInfo;
this.publicKey = publicKey;
this.id = id;
this.banned = banned;
}
@Override
public HardwareReportRequest.HardwareInfo getHardwareInfo() {
return hardwareInfo;
}
@Override
public byte[] getPublicKey() {
return publicKey;
}
@Override
public String getId() {
return String.valueOf(id);
}
@Override
public boolean isBanned() {
return banned;
}
@Override
public String toString() {
return "MySQLUserHardware{" +
"hardwareInfo=" + hardwareInfo +
", publicKey=" + (publicKey == null ? null : new String(Base64.getEncoder().encode(publicKey))) +
", id=" + id +
", banned=" + banned +
'}';
}
}
public static class MySQLUser extends SQLUser {
protected long hwidId;
public MySQLUser(UUID uuid, String username, String accessToken, String serverId, String password, long hwidId) {
super(uuid, username, accessToken, serverId, password);
this.hwidId = hwidId;
}
@Override
public String toString() {
return "MySQLUser{" +
"uuid=" + uuid +
", username='" + username + '\'' +
", permissions=" + permissions +
", hwidId=" + hwidId +
'}';
}
}
}

View file

@ -0,0 +1,21 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.PostgreSQLSourceConfig;
import pro.gravit.launchserver.auth.SQLSourceConfig;
public class PostgresSQLCoreProvider extends AbstractSQLCoreProvider {
public PostgreSQLSourceConfig postgresSQLHolder;
@Override
public SQLSourceConfig getSQLConfig() {
return postgresSQLHolder;
}
@Override
public void init(LaunchServer server, AuthProviderPair pair) {
super.init(server, pair);
logger.warn("Method 'postgresql' deprecated and may be removed in future release. Please use new 'sql' method: https://gravitlauncher.com/auth");
}
}

View file

@ -0,0 +1,57 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import java.io.IOException;
import java.util.UUID;
public class RejectAuthCoreProvider extends AuthCoreProvider {
@Override
public User getUserByUsername(String username) {
return null;
}
@Override
public User getUserByUUID(UUID uuid) {
return null;
}
@Override
public UserSession getUserSessionByOAuthAccessToken(String accessToken) {
return null;
}
@Override
public AuthManager.AuthReport refreshAccessToken(String refreshToken, AuthResponse.AuthContext context) {
return null;
}
@Override
public void verifyAuth(AuthResponse.AuthContext context) throws AuthException {
throw new AuthException("Please configure AuthCoreProvider");
}
@Override
public AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context, AuthRequest.AuthPasswordInterface password, boolean minecraftAccess) throws IOException {
throw new AuthException("Please configure AuthCoreProvider");
}
@Override
public User checkServer(Client client, String username, String serverID) {
return null;
}
@Override
public boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) {
return false;
}
@Override
public void close() {
}
}

View file

@ -0,0 +1,391 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launcher.base.request.secure.HardwareReportRequest;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.HikariSQLSourceConfig;
import pro.gravit.launchserver.auth.MySQLSourceConfig;
import pro.gravit.launchserver.auth.SQLSourceConfig;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportExtendedCheckServer;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportHardware;
import pro.gravit.launchserver.auth.core.interfaces.session.UserSessionSupportHardware;
import pro.gravit.launchserver.socket.Client;
import java.io.IOException;
import java.sql.*;
import java.util.Base64;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
public class SQLCoreProvider extends AbstractSQLCoreProvider implements AuthSupportHardware, AuthSupportExtendedCheckServer {
public HikariSQLSourceConfig holder;
@Override
public void close() {
super.close();
holder.close();
}
@Override
public SQLSourceConfig getSQLConfig() {
return holder;
}
public String hardwareIdColumn;
public String tableHWID = "hwids";
public String tableHWIDLog = "hwidLog";
public double criticalCompareLevel = 1.0;
private transient String sqlFindHardwareByPublicKey;
private transient String sqlFindHardwareByData;
private transient String sqlFindHardwareById;
private transient String sqlCreateHardware;
private transient String sqlCreateHWIDLog;
private transient String sqlUpdateHardwarePublicKey;
private transient String sqlUpdateHardwareBanned;
private transient String sqlUpdateUsers;
private transient String sqlUsersByHwidId;
@Override
public void init(LaunchServer server, AuthProviderPair pair) {
holder.init();
super.init(server, pair);
String userInfoCols = makeUserCols();
String hardwareInfoCols = "id, hwDiskId, baseboardSerialNumber, displayId, bitness, totalMemory, logicalProcessors, physicalProcessors, processorMaxFreq, battery, id, graphicCard, banned, publicKey";
if (sqlFindHardwareByPublicKey == null)
sqlFindHardwareByPublicKey = "SELECT %s FROM %s WHERE publicKey = ?".formatted(hardwareInfoCols, tableHWID);
if (sqlFindHardwareById == null)
sqlFindHardwareById = "SELECT %s FROM %s WHERE id = ?".formatted(hardwareInfoCols, tableHWID);
if (sqlUsersByHwidId == null)
sqlUsersByHwidId = "SELECT %s FROM %s WHERE %s = ?".formatted(userInfoCols, table, hardwareIdColumn);
if (sqlFindHardwareByData == null)
sqlFindHardwareByData = "SELECT %s FROM %s".formatted(hardwareInfoCols, tableHWID);
if (sqlCreateHardware == null)
sqlCreateHardware = "INSERT INTO %s (publickey, hwDiskId, baseboardSerialNumber, displayId, bitness, totalMemory, logicalProcessors, physicalProcessors, processorMaxFreq, graphicCard, battery, banned) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '0')".formatted(tableHWID);
if (sqlCreateHWIDLog == null)
sqlCreateHWIDLog = "INSERT INTO %s (hwidId, newPublicKey) VALUES (?, ?)".formatted(tableHWIDLog);
if (sqlUpdateHardwarePublicKey == null)
sqlUpdateHardwarePublicKey = "UPDATE %s SET publicKey = ? WHERE id = ?".formatted(tableHWID);
sqlUpdateHardwareBanned = "UPDATE %s SET banned = ? WHERE id = ?".formatted(tableHWID);
sqlUpdateUsers = "UPDATE %s SET %s = ? WHERE %s = ?".formatted(table, hardwareIdColumn, uuidColumn);
}
@Override
protected String makeUserCols() {
return super.makeUserCols().concat(", ").concat(hardwareIdColumn);
}
@Override
protected SQLUser constructUser(ResultSet set) throws SQLException {
return set.next() ? new SQLUser(UUID.fromString(set.getString(uuidColumn)), set.getString(usernameColumn),
set.getString(accessTokenColumn), set.getString(serverIDColumn), set.getString(passwordColumn), set.getLong(hardwareIdColumn)) : null;
}
private SQLUserHardware fetchHardwareInfo(ResultSet set) throws SQLException {
HardwareReportRequest.HardwareInfo hardwareInfo = new HardwareReportRequest.HardwareInfo();
hardwareInfo.hwDiskId = set.getString("hwDiskId");
hardwareInfo.baseboardSerialNumber = set.getString("baseboardSerialNumber");
byte[] displayId = set.getBytes("displayId");
hardwareInfo.displayId = displayId == null ? null : displayId;
hardwareInfo.bitness = set.getInt("bitness");
hardwareInfo.totalMemory = set.getLong("totalMemory");
hardwareInfo.logicalProcessors = set.getInt("logicalProcessors");
hardwareInfo.physicalProcessors = set.getInt("physicalProcessors");
hardwareInfo.processorMaxFreq = set.getLong("processorMaxFreq");
hardwareInfo.battery = set.getBoolean("battery");
hardwareInfo.graphicCard = set.getString("graphicCard");
byte[] publicKey = set.getBytes("publicKey");
long id = set.getLong("id");
boolean banned = set.getBoolean("banned");
return new SQLUserHardware(hardwareInfo, publicKey, id, banned);
}
private void setUserHardwareId(Connection connection, UUID uuid, long hwidId) throws SQLException {
PreparedStatement s = connection.prepareStatement(sqlUpdateUsers);
s.setLong(1, hwidId);
s.setString(2, uuid.toString());
s.executeUpdate();
}
@Override
public UserHardware getHardwareInfoByPublicKey(byte[] publicKey) {
try (Connection connection = holder.getConnection()) {
connection.setAutoCommit(false);
PreparedStatement s = connection.prepareStatement(sqlFindHardwareByPublicKey);
s.setBytes(1, publicKey);
try (ResultSet set = s.executeQuery()) {
if (set.next()) {
connection.commit();
return fetchHardwareInfo(set);
} else {
connection.commit();
return null;
}
}
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public UserHardware getHardwareInfoByData(HardwareReportRequest.HardwareInfo info) {
try (Connection connection = holder.getConnection()) {
connection.setAutoCommit(false);
PreparedStatement s = connection.prepareStatement(sqlFindHardwareByData);
try (ResultSet set = s.executeQuery()) {
while (set.next()) {
SQLUserHardware hw = fetchHardwareInfo(set);
AuthSupportHardware.HardwareInfoCompareResult result = compareHardwareInfo(hw.getHardwareInfo(), info);
if (result.compareLevel > criticalCompareLevel) {
connection.commit();
return hw;
} else {
connection.commit();
}
}
}
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
}
return null;
}
@Override
public UserHardware getHardwareInfoById(String id) {
try (Connection connection = holder.getConnection()) {
connection.setAutoCommit(false);
PreparedStatement s = connection.prepareStatement(sqlFindHardwareById);
s.setLong(1, Long.parseLong(id));
try (ResultSet set = s.executeQuery()) {
if (set.next()) {
connection.commit();
return fetchHardwareInfo(set);
} else {
connection.commit();
return null;
}
}
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public UserHardware createHardwareInfo(HardwareReportRequest.HardwareInfo hardwareInfo, byte[] publicKey) {
try (Connection connection = holder.getConnection()) {
connection.setAutoCommit(false);
PreparedStatement s = connection.prepareStatement(sqlCreateHardware, Statement.RETURN_GENERATED_KEYS);
s.setBytes(1, publicKey);
s.setString(2, hardwareInfo.hwDiskId);
s.setString(3, hardwareInfo.baseboardSerialNumber);
s.setBytes(4, hardwareInfo.displayId == null ? null : hardwareInfo.displayId);
s.setInt(5, hardwareInfo.bitness);
s.setLong(6, hardwareInfo.totalMemory);
s.setInt(7, hardwareInfo.logicalProcessors);
s.setInt(8, hardwareInfo.physicalProcessors);
s.setLong(9, hardwareInfo.processorMaxFreq);
s.setString(10, hardwareInfo.graphicCard);
s.setBoolean(11, hardwareInfo.battery);
s.executeUpdate();
try (ResultSet generatedKeys = s.getGeneratedKeys()) {
if (generatedKeys.next()) {
//writeHwidLog(connection, generatedKeys.getLong(1), publicKey);
long id = generatedKeys.getLong(1);
connection.commit();
return new SQLUserHardware(hardwareInfo, publicKey, id, false);
}
}
connection.commit();
return null;
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
return null;
}
}
@Override
public void connectUserAndHardware(UserSession userSession, UserHardware hardware) {
AbstractSQLCoreProvider.SQLUserSession SQLUserSession = (AbstractSQLCoreProvider.SQLUserSession) userSession;
SQLUser SQLUser = (SQLUser) SQLUserSession.getUser();
SQLUserHardware SQLUserHardware = (SQLUserHardware) hardware;
if (SQLUser.hwidId == SQLUserHardware.id) return;
SQLUser.hwidId = SQLUserHardware.id;
try (Connection connection = holder.getConnection()) {
setUserHardwareId(connection, SQLUser.getUUID(), SQLUserHardware.id);
} catch (SQLException throwables) {
logger.error("SQL Error", throwables);
}
}
@Override
public void addPublicKeyToHardwareInfo(UserHardware hardware, byte[] publicKey) {
SQLUserHardware SQLUserHardware = (SQLUserHardware) hardware;
SQLUserHardware.publicKey = publicKey;
try (Connection connection = holder.getConnection()) {
connection.setAutoCommit(false);
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwarePublicKey);
s.setBytes(1, publicKey);
s.setLong(2, SQLUserHardware.id);
s.executeUpdate();
connection.commit();
} catch (SQLException e) {
logger.error("SQL error", e);
}
}
@Override
public Iterable<User> getUsersByHardwareInfo(UserHardware hardware) {
List<User> users = new LinkedList<>();
try (Connection c = holder.getConnection()) {
c.setAutoCommit(false);
PreparedStatement s = c.prepareStatement(sqlUsersByHwidId);
s.setLong(1, Long.parseLong(hardware.getId()));
s.setQueryTimeout(MySQLSourceConfig.TIMEOUT);
try (ResultSet set = s.executeQuery()) {
while (!set.isLast()) {
users.add(constructUser(set));
}
}
c.commit();
} catch (SQLException e) {
logger.error("SQL error", e);
return null;
}
return users;
}
@Override
public void banHardware(UserHardware hardware) {
SQLUserHardware SQLUserHardware = (SQLUserHardware) hardware;
SQLUserHardware.banned = true;
try (Connection connection = holder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwareBanned);
s.setBoolean(1, true);
s.setLong(2, SQLUserHardware.id);
s.executeUpdate();
} catch (SQLException e) {
logger.error("SQL Error", e);
}
}
@Override
public void unbanHardware(UserHardware hardware) {
SQLUserHardware SQLUserHardware = (SQLUserHardware) hardware;
SQLUserHardware.banned = false;
try (Connection connection = holder.getConnection()) {
PreparedStatement s = connection.prepareStatement(sqlUpdateHardwareBanned);
s.setBoolean(1, false);
s.setLong(2, SQLUserHardware.id);
s.executeUpdate();
} catch (SQLException e) {
logger.error("SQL error", e);
}
}
@Override
protected AbstractSQLCoreProvider.SQLUserSession createSession(AbstractSQLCoreProvider.SQLUser user) {
return new SQLUserSession(user);
}
@Override
public UserSession extendedCheckServer(Client client, String username, String serverID) {
AbstractSQLCoreProvider.SQLUser user = (AbstractSQLCoreProvider.SQLUser) getUserByUsername(username);
if (user == null) {
return null;
}
if (user.getUsername().equals(username) && user.getServerId().equals(serverID)) {
return createSession(user);
}
return null;
}
public class SQLUserSession extends AbstractSQLCoreProvider.SQLUserSession implements UserSessionSupportHardware {
private transient SQLUser SQLUser;
protected transient SQLUserHardware hardware;
public SQLUserSession(AbstractSQLCoreProvider.SQLUser user) {
super(user);
SQLUser = (SQLUser) user;
}
@Override
public String getHardwareId() {
return SQLUser.hwidId == 0 ? null : String.valueOf(SQLUser.hwidId);
}
@Override
public UserHardware getHardware() {
if(hardware == null) {
hardware = (SQLUserHardware) getHardwareInfoById(String.valueOf(SQLUser.hwidId));
}
return hardware;
}
}
public static class SQLUserHardware implements UserHardware {
private final HardwareReportRequest.HardwareInfo hardwareInfo;
private final long id;
private byte[] publicKey;
private boolean banned;
public SQLUserHardware(HardwareReportRequest.HardwareInfo hardwareInfo, byte[] publicKey, long id, boolean banned) {
this.hardwareInfo = hardwareInfo;
this.publicKey = publicKey;
this.id = id;
this.banned = banned;
}
@Override
public HardwareReportRequest.HardwareInfo getHardwareInfo() {
return hardwareInfo;
}
@Override
public byte[] getPublicKey() {
return publicKey;
}
@Override
public String getId() {
return String.valueOf(id);
}
@Override
public boolean isBanned() {
return banned;
}
@Override
public String toString() {
return "SQLUserHardware{" +
"hardwareInfo=" + hardwareInfo +
", publicKey=" + (publicKey == null ? null : new String(Base64.getEncoder().encode(publicKey))) +
", id=" + id +
", banned=" + banned +
'}';
}
}
public static class SQLUser extends AbstractSQLCoreProvider.SQLUser {
protected long hwidId;
public SQLUser(UUID uuid, String username, String accessToken, String serverId, String password, long hwidId) {
super(uuid, username, accessToken, serverId, password);
this.hwidId = hwidId;
}
@Override
public String toString() {
return "SQLUser{" +
"uuid=" + uuid +
", username='" + username + '\'' +
", permissions=" + permissions +
", hwidId=" + hwidId +
'}';
}
}
}

View file

@ -0,0 +1,17 @@
package pro.gravit.launchserver.auth.core;
import pro.gravit.launcher.base.ClientPermissions;
import java.util.UUID;
public interface User {
String getUsername();
UUID getUUID();
ClientPermissions getPermissions();
default boolean isBanned() {
return false;
}
}

View file

@ -0,0 +1,11 @@
package pro.gravit.launchserver.auth.core;
public interface UserSession {
String getID();
User getUser();
String getMinecraftAccessToken();
long getExpireIn();
}

View file

@ -0,0 +1,13 @@
package pro.gravit.launchserver.auth.core.interfaces;
import pro.gravit.launcher.base.request.secure.HardwareReportRequest;
public interface UserHardware {
HardwareReportRequest.HardwareInfo getHardwareInfo();
byte[] getPublicKey();
String getId();
boolean isBanned();
}

View file

@ -0,0 +1,4 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
public interface AuthSupport {
}

View file

@ -0,0 +1,22 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launcher.base.events.request.AssetUploadInfoRequestEvent;
import pro.gravit.launcher.base.events.request.AuthRequestEvent;
import pro.gravit.launcher.base.events.request.GetAssetUploadUrlRequestEvent;
import pro.gravit.launchserver.auth.Feature;
import pro.gravit.launchserver.auth.core.User;
import java.util.Set;
@Feature(GetAssetUploadUrlRequestEvent.FEATURE_NAME)
public interface AuthSupportAssetUpload extends AuthSupport {
String getAssetUploadUrl(String name, User user);
default AuthRequestEvent.OAuthRequestEvent getAssetUploadToken(String name, User user) {
return null;
}
default AssetUploadInfoRequestEvent getAssetUploadInfo(User user) {
return new AssetUploadInfoRequestEvent(Set.of("SKIN", "CAPE"), AssetUploadInfoRequestEvent.SlimSupportConf.USER);
}
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.auth.core.UserSession;
public interface AuthSupportExit extends AuthSupport {
void deleteSession(UserSession session);
void exitUser(User user);
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launchserver.auth.core.UserSession;
import pro.gravit.launchserver.socket.Client;
import java.io.IOException;
public interface AuthSupportExtendedCheckServer {
UserSession extendedCheckServer(Client client, String username, String serverID);
}

View file

@ -0,0 +1,9 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launchserver.auth.Feature;
import pro.gravit.launchserver.auth.core.User;
@Feature("users")
public interface AuthSupportGetAllUsers extends AuthSupport {
Iterable<User> getAllUsers();
}

View file

@ -0,0 +1,98 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launcher.base.request.secure.HardwareReportRequest;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.auth.core.UserSession;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
import pro.gravit.launchserver.helper.DamerauHelper;
import java.util.Arrays;
public interface AuthSupportHardware extends AuthSupport {
UserHardware getHardwareInfoByPublicKey(byte[] publicKey);
UserHardware getHardwareInfoByData(HardwareReportRequest.HardwareInfo info);
UserHardware getHardwareInfoById(String id);
UserHardware createHardwareInfo(HardwareReportRequest.HardwareInfo info, byte[] publicKey);
void connectUserAndHardware(UserSession userSession, UserHardware hardware);
void addPublicKeyToHardwareInfo(UserHardware hardware, byte[] publicKey);
Iterable<User> getUsersByHardwareInfo(UserHardware hardware);
void banHardware(UserHardware hardware);
void unbanHardware(UserHardware hardware);
default void normalizeHardwareInfo(HardwareReportRequest.HardwareInfo hardwareInfo) {
if (hardwareInfo.baseboardSerialNumber != null)
hardwareInfo.baseboardSerialNumber = hardwareInfo.baseboardSerialNumber.trim();
if (hardwareInfo.hwDiskId != null) hardwareInfo.hwDiskId = hardwareInfo.hwDiskId.trim();
}
//Required normalize HardwareInfo
default HardwareInfoCompareResult compareHardwareInfo(HardwareReportRequest.HardwareInfo first, HardwareReportRequest.HardwareInfo second) {
HardwareInfoCompareResult result = new HardwareInfoCompareResult();
if (first.hwDiskId == null || first.hwDiskId.isEmpty()) result.firstSpoofingLevel += 0.9;
if (first.displayId == null || first.displayId.length < 4) result.firstSpoofingLevel += 0.3;
if (first.baseboardSerialNumber == null || first.baseboardSerialNumber.trim().isEmpty())
result.firstSpoofingLevel += 0.2;
if (second.hwDiskId == null || second.hwDiskId.trim().isEmpty()) result.secondSpoofingLevel += 0.9;
if (second.displayId == null || second.displayId.length < 4) result.secondSpoofingLevel += 0.3;
if (second.baseboardSerialNumber == null || second.baseboardSerialNumber.trim().isEmpty())
result.secondSpoofingLevel += 0.2;
if (first.hwDiskId != null && second.hwDiskId != null) {
int hwDIskIdRate = DamerauHelper.calculateDistance(first.hwDiskId.toLowerCase(), second.hwDiskId.toLowerCase());
if (hwDIskIdRate == 0) // 100% compare
{
result.compareLevel += 0.99;
} else if (hwDIskIdRate < 3) //Very small change
{
result.compareLevel += 0.85;
} else if (hwDIskIdRate < (first.hwDiskId.length() + second.hwDiskId.length()) / 4) {
double addLevel = hwDIskIdRate / ((double) (first.hwDiskId.length() + second.hwDiskId.length()) / 2.0);
if (addLevel > 0.0 && addLevel < 0.85) result.compareLevel += addLevel;
}
}
if (first.baseboardSerialNumber != null && second.baseboardSerialNumber != null) {
int baseboardSerialRate = DamerauHelper.calculateDistance(first.baseboardSerialNumber.toLowerCase(), second.baseboardSerialNumber.toLowerCase());
if (baseboardSerialRate == 0) // 100% compare
{
result.compareLevel += 0.3;
} else if (baseboardSerialRate < 3) //Very small change
{
result.compareLevel += 0.15;
}
}
if (first.displayId != null && second.displayId != null) {
if (Arrays.equals(first.displayId, second.displayId)) {
result.compareLevel += 0.75;
}
}
//Check statistic info
if (first.logicalProcessors == 0 || first.physicalProcessors == 0 || first.logicalProcessors < first.physicalProcessors) //WTF
result.firstSpoofingLevel += 0.9;
if (second.logicalProcessors == 0 || second.physicalProcessors == 0 || second.logicalProcessors < second.physicalProcessors) //WTF
result.secondSpoofingLevel += 0.9;
if (first.physicalProcessors == second.physicalProcessors && first.logicalProcessors == second.logicalProcessors)
result.compareLevel += 0.05;
if (first.battery != second.battery)
result.compareLevel -= 0.05;
if (first.processorMaxFreq == second.processorMaxFreq)
result.compareLevel += 0.1;
if (first.totalMemory == second.totalMemory)
result.compareLevel += 0.1;
if (Math.abs(first.totalMemory - second.totalMemory) < 32 * 1024)
result.compareLevel += 0.05;
return result;
}
class HardwareInfoCompareResult {
public double firstSpoofingLevel = 0.0;
public double secondSpoofingLevel = 0.0;
public double compareLevel;
}
}

View file

@ -0,0 +1,12 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launchserver.auth.Feature;
import pro.gravit.launchserver.auth.core.User;
import java.util.Map;
@Feature("registration")
public interface AuthSupportRegistration extends AuthSupport {
User registration(String login, String email, AuthRequest.AuthPasswordInterface password, Map<String, String> properties);
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth.core.interfaces.provider;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.manangers.AuthManager;
import java.io.IOException;
public interface AuthSupportSudo {
AuthManager.AuthReport sudo(User user, boolean shadow) throws IOException;
}

View file

@ -0,0 +1,8 @@
package pro.gravit.launchserver.auth.core.interfaces.session;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
public interface UserSessionSupportHardware {
String getHardwareId();
UserHardware getHardware();
}

View file

@ -0,0 +1,13 @@
package pro.gravit.launchserver.auth.core.interfaces.session;
import java.security.PrivateKey;
import java.security.PublicKey;
public interface UserSessionSupportKeys {
ClientProfileKeys getClientProfileKeys();
record ClientProfileKeys(PublicKey publicKey, PrivateKey privateKey, byte[] signature /* V2 */, long expiresAt,
long refreshedAfter) {
}
}

View file

@ -0,0 +1,7 @@
package pro.gravit.launchserver.auth.core.interfaces.session;
import java.util.Map;
public interface UserSessionSupportProperties {
Map<String, String> getProperties();
}

View file

@ -0,0 +1,25 @@
package pro.gravit.launchserver.auth.core.interfaces.user;
import java.util.Map;
public interface UserSupportAdditionalData {
String getProperty(String name);
default String getPropertyUnprivileged(String name) {
return getProperty(name);
}
default String getPropertyUnprivilegedSelf(String name) {
return getProperty(name);
}
Map<String, String> getPropertiesMap();
default Map<String, String> getPropertiesMapUnprivileged() {
return getPropertiesMap();
}
default Map<String, String> getPropertiesMapUnprivilegedSelf() {
return getPropertiesMapUnprivileged();
}
}

View file

@ -0,0 +1,7 @@
package pro.gravit.launchserver.auth.core.interfaces.user;
import java.util.Map;
public interface UserSupportProperties {
Map<String, String> getProperties();
}

View file

@ -0,0 +1,34 @@
package pro.gravit.launchserver.auth.core.interfaces.user;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.launcher.base.profiles.Texture;
import java.util.HashMap;
import java.util.Map;
public interface UserSupportTextures {
Texture getSkinTexture();
Texture getCloakTexture();
default Texture getSkinTexture(ClientProfile profile) {
return getSkinTexture();
}
default Texture getCloakTexture(ClientProfile profile) {
return getCloakTexture();
}
default Map<String, Texture> getUserAssets() {
var skin = getSkinTexture();
var cape = getCloakTexture();
Map<String, Texture> map = new HashMap<>();
if (skin != null) {
map.put("SKIN", skin);
}
if (cape != null) {
map.put("CAPE", cape);
}
return map;
}
}

View file

@ -0,0 +1,14 @@
package pro.gravit.launchserver.auth.core.openid;
import com.google.gson.annotations.SerializedName;
public record AccessTokenResponse(@SerializedName("access_token") String accessToken,
@SerializedName("expires_in") Long expiresIn,
@SerializedName("refresh_expires_in") Long refreshExpiresIn,
@SerializedName("refresh_token") String refreshToken,
@SerializedName("token_type") String tokenType,
@SerializedName("id_token") String idToken,
@SerializedName("not-before-policy") Integer notBeforePolicy,
@SerializedName("session_state") String sessionState,
@SerializedName("scope") String scope) {
}

View file

@ -0,0 +1,178 @@
package pro.gravit.launchserver.auth.core.openid;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.base.request.auth.AuthRequest;
import pro.gravit.launcher.base.request.auth.password.AuthCodePassword;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.HikariSQLSourceConfig;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.auth.core.UserSession;
import pro.gravit.launchserver.manangers.AuthManager;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import pro.gravit.utils.helper.LogHelper;
import java.io.IOException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class OpenIDAuthCoreProvider extends AuthCoreProvider {
private transient SQLUserStore sqlUserStore;
private transient SQLServerSessionStore sqlSessionStore;
private transient OpenIDAuthenticator openIDAuthenticator;
private OpenIDConfig openIDConfig;
private HikariSQLSourceConfig sqlSourceConfig;
@Override
public List<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> getDetails(Client client) {
return openIDAuthenticator.getDetails();
}
@Override
public User getUserByUsername(String username) {
return sqlUserStore.getByUsername(username);
}
@Override
public User getUserByUUID(UUID uuid) {
return sqlUserStore.getUserByUUID(uuid);
}
@Override
public UserSession getUserSessionByOAuthAccessToken(String accessToken) throws OAuthAccessTokenExpired {
return openIDAuthenticator.getUserSessionByOAuthAccessToken(accessToken);
}
@Override
public AuthManager.AuthReport refreshAccessToken(String oldRefreshToken, AuthResponse.AuthContext context) {
var tokens = openIDAuthenticator.refreshAccessToken(oldRefreshToken);
var accessToken = tokens.accessToken();
var refreshToken = tokens.refreshToken();
long expiresIn = TimeUnit.SECONDS.toMillis(tokens.accessTokenExpiresIn());
UserSession session;
try {
session = openIDAuthenticator.getUserSessionByOAuthAccessToken(accessToken);
} catch (OAuthAccessTokenExpired e) {
throw new RuntimeException("invalid token", e);
}
return AuthManager.AuthReport.ofOAuth(accessToken, refreshToken,
expiresIn, session);
}
@Override
public AuthManager.AuthReport authorize(String login, AuthResponse.AuthContext context, AuthRequest.AuthPasswordInterface password, boolean minecraftAccess) throws IOException {
if (password == null) {
throw AuthException.wrongPassword();
}
var authCodePassword = (AuthCodePassword) password;
var tokens = openIDAuthenticator.authorize(authCodePassword);
var accessToken = tokens.accessToken();
var refreshToken = tokens.refreshToken();
var user = openIDAuthenticator.createUserFromToken(accessToken);
long expiresIn = TimeUnit.SECONDS.toMillis(tokens.accessTokenExpiresIn());
sqlUserStore.createOrUpdateUser(user);
UserSession session;
try {
session = openIDAuthenticator.getUserSessionByOAuthAccessToken(accessToken);
} catch (OAuthAccessTokenExpired e) {
throw new AuthException("invalid token", e);
}
if (minecraftAccess) {
var minecraftToken = generateMinecraftToken(user);
return AuthManager.AuthReport.ofOAuthWithMinecraft(minecraftToken, accessToken, refreshToken,
expiresIn, session);
} else {
return AuthManager.AuthReport.ofOAuth(accessToken, refreshToken,
expiresIn, session);
}
}
private String generateMinecraftToken(User user) {
return Jwts.builder()
.issuer("LaunchServer")
.subject(user.getUUID().toString())
.claim("preferred_username", user.getUsername())
.expiration(Date.from(Instant.now().plus(24, ChronoUnit.HOURS)))
.signWith(server.keyAgreementManager.ecdsaPrivateKey)
.compact();
}
private User createUserFromMinecraftToken(String accessToken) throws AuthException {
try {
var parser = Jwts.parser()
.requireIssuer("LaunchServer")
.verifyWith(server.keyAgreementManager.ecdsaPublicKey)
.build();
var claims = parser.parseSignedClaims(accessToken);
var username = claims.getPayload().get("preferred_username", String.class);
var uuid = UUID.fromString(claims.getPayload().getSubject());
return new UserEntity(username, uuid, new ClientPermissions());
} catch (JwtException e) {
throw new AuthException("Bad minecraft token", e);
}
}
@Override
public void init(LaunchServer server, AuthProviderPair pair) {
super.init(server, pair);
this.sqlSourceConfig.init();
this.sqlUserStore = new SQLUserStore(sqlSourceConfig);
this.sqlUserStore.init();
this.sqlSessionStore = new SQLServerSessionStore(sqlSourceConfig);
this.sqlSessionStore.init();
this.openIDAuthenticator = new OpenIDAuthenticator(openIDConfig);
}
@Override
public User checkServer(Client client, String username, String serverID) {
var savedServerId = sqlSessionStore.getServerIdByUsername(username);
if (!serverID.equals(savedServerId)) {
return null;
}
return sqlUserStore.getByUsername(username);
}
@Override
public boolean joinServer(Client client, String username, UUID uuid, String accessToken, String serverID) {
User user;
try {
user = createUserFromMinecraftToken(accessToken);
} catch (AuthException e) {
LogHelper.error(e);
return false;
}
if (!user.getUUID().equals(uuid)) {
return false;
}
sqlUserStore.createOrUpdateUser(user);
return sqlSessionStore.joinServer(user.getUUID(), user.getUsername(), serverID);
}
@Override
public void close() {
sqlSourceConfig.close();
}
}

View file

@ -0,0 +1,232 @@
package pro.gravit.launchserver.auth.core.openid;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Jwk;
import io.jsonwebtoken.security.JwkSet;
import io.jsonwebtoken.security.Jwks;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.base.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.base.request.auth.details.AuthWebViewDetails;
import pro.gravit.launcher.base.request.auth.password.AuthCodePassword;
import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.auth.core.UserSession;
import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.QueryHelper;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.security.Key;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
public class OpenIDAuthenticator {
private static final HttpClient CLIENT = HttpClient.newBuilder().build();
private final OpenIDConfig openIDConfig;
private final JwtParser jwtParser;
public OpenIDAuthenticator(OpenIDConfig openIDConfig) {
this.openIDConfig = openIDConfig;
var keyLocator = loadKeyLocator(openIDConfig);
this.jwtParser = Jwts.parser()
.keyLocator(keyLocator)
.requireIssuer(openIDConfig.issuer())
.require("azp", openIDConfig.clientId())
.build();
}
public List<GetAvailabilityAuthRequestEvent.AuthAvailabilityDetails> getDetails() {
var state = UUID.randomUUID().toString();
var uri = QueryBuilder.get(openIDConfig.authorizationEndpoint())
.addQuery("response_type", "code")
.addQuery("client_id", openIDConfig.clientId())
.addQuery("redirect_uri", openIDConfig.redirectUri())
.addQuery("scope", openIDConfig.scopes())
.addQuery("state", state)
.toUriString();
return List.of(new AuthWebViewDetails(uri, openIDConfig.redirectUri()));
}
public TokenResponse refreshAccessToken(String oldRefreshToken) {
var postBody = QueryBuilder.post()
.addQuery("grant_type", "refresh_token")
.addQuery("refresh_token", oldRefreshToken)
.addQuery("client_id", openIDConfig.clientId())
.addQuery("client_secret", openIDConfig.clientSecret())
.toString();
var accessTokenResponse = requestToken(postBody);
var accessToken = accessTokenResponse.accessToken();
var refreshToken = accessTokenResponse.refreshToken();
try {
readAndVerifyToken(accessToken);
} catch (AuthException e) {
throw new RuntimeException(e);
}
var accessTokenExpiresIn = Objects.requireNonNullElse(accessTokenResponse.expiresIn(), 0L);
var refreshTokenExpiresIn = Objects.requireNonNullElse(accessTokenResponse.refreshExpiresIn(), 0L);
return new TokenResponse(accessToken, accessTokenExpiresIn,
refreshToken, refreshTokenExpiresIn);
}
public UserSession getUserSessionByOAuthAccessToken(String accessToken) throws AuthCoreProvider.OAuthAccessTokenExpired {
Jws<Claims> token;
try {
token = readAndVerifyToken(accessToken);
} catch (AuthException e) {
throw new AuthCoreProvider.OAuthAccessTokenExpired("Can't read token", e);
}
var user = createUserFromToken(token);
long expiresIn = 0;
var expDate = token.getPayload().getExpiration();
if (expDate != null) {
expiresIn = expDate.toInstant().toEpochMilli();
}
return new OpenIDUserSession(user, accessToken, expiresIn);
}
public TokenResponse authorize(AuthCodePassword authCode) throws IOException {
var uri = URI.create(authCode.uri);
var queries = QueryHelper.splitUriQuery(uri);
String code = CommonHelper.multimapFirstOrNullValue("code", queries);
String error = CommonHelper.multimapFirstOrNullValue("error", queries);
String errorDescription = CommonHelper.multimapFirstOrNullValue("error_description", queries);
if (error != null && !error.isBlank()) {
throw new AuthException("Auth error. Error: %s, description: %s".formatted(error, errorDescription));
}
var postBody = QueryBuilder.post()
.addQuery("grant_type", "authorization_code")
.addQuery("code", code)
.addQuery("redirect_uri", openIDConfig.redirectUri())
.addQuery("client_id", openIDConfig.clientId())
.addQuery("client_secret", openIDConfig.clientSecret())
.toString();
var accessTokenResponse = requestToken(postBody);
var accessToken = accessTokenResponse.accessToken();
var refreshToken = accessTokenResponse.refreshToken();
readAndVerifyToken(accessToken);
var accessTokenExpiresIn = Objects.requireNonNullElse(accessTokenResponse.expiresIn(), 0L);
var refreshTokenExpiresIn = Objects.requireNonNullElse(accessTokenResponse.refreshExpiresIn(), 0L);
return new TokenResponse(accessToken, accessTokenExpiresIn,
refreshToken, refreshTokenExpiresIn);
}
public User createUserFromToken(String accessToken) throws AuthException {
return createUserFromToken(readAndVerifyToken(accessToken));
}
private Jws<Claims> readAndVerifyToken(String accessToken) throws AuthException {
if (accessToken == null) {
throw new AuthException("Token is null");
}
try {
return jwtParser.parseSignedClaims(accessToken);
} catch (JwtException e) {
throw new AuthException("Bad token", e);
}
}
private User createUserFromToken(Jws<Claims> token) {
var username = token.getPayload().get(openIDConfig.extractorConfig().usernameClaim(), String.class);
var uuidStr = token.getPayload().get(openIDConfig.extractorConfig().uuidClaim(), String.class);
var uuid = UUID.fromString(uuidStr);
return new UserEntity(username, uuid, new ClientPermissions());
}
private AccessTokenResponse requestToken(String postBody) {
var request = HttpRequest.newBuilder()
.uri(openIDConfig.tokenUri())
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(postBody))
.build();
HttpResponse<String> resp;
try {
resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
return Launcher.gsonManager.gson.fromJson(resp.body(), AccessTokenResponse.class);
}
private static KeyLocator loadKeyLocator(OpenIDConfig openIDConfig) {
var request = HttpRequest.newBuilder(openIDConfig.jwksUri()).GET().build();
HttpResponse<String> response;
try {
response = CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
var jwks = Jwks.setParser().build().parse(response.body());
return new KeyLocator(jwks);
}
private static class KeyLocator extends LocatorAdapter<Key> {
private final Map<String, Key> keys;
public KeyLocator(JwkSet jwks) {
this.keys = jwks.getKeys().stream().collect(
Collectors.toMap(jwk -> String.valueOf(jwk.get("kid")), Jwk::toKey));
}
@Override
protected Key locate(JweHeader header) {
return super.locate(header);
}
@Override
protected Key locate(JwsHeader header) {
return keys.get(header.getKeyId());
}
@Override
protected Key doLocate(Header header) {
return super.doLocate(header);
}
}
record OpenIDUserSession(User user, String token, long expiresIn) implements UserSession {
@Override
public String getID() {
return user.getUsername();
}
@Override
public User getUser() {
return user;
}
@Override
public String getMinecraftAccessToken() {
return token;
}
@Override
public long getExpireIn() {
return expiresIn;
}
}
}

View file

@ -0,0 +1,10 @@
package pro.gravit.launchserver.auth.core.openid;
import java.net.URI;
public record OpenIDConfig(URI tokenUri, String authorizationEndpoint, String clientId, String clientSecret,
String redirectUri, URI jwksUri, String scopes, String issuer,
ClaimExtractorConfig extractorConfig) {
public record ClaimExtractorConfig(String usernameClaim, String uuidClaim) {}
}

View file

@ -0,0 +1,59 @@
package pro.gravit.launchserver.auth.core.openid;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/**
* @author Xakep_SDK
*/
public class QueryBuilder {
private final String uri;
private final StringBuilder query = new StringBuilder();
public QueryBuilder(String uri) {
this.uri = uri;
}
public static QueryBuilder get(String uri) {
Objects.requireNonNull(uri, "uri");
if (uri.endsWith("/")) {
uri = uri.substring(0, uri.length() - 1);
}
return new QueryBuilder(uri);
}
public static QueryBuilder post() {
return new QueryBuilder(null);
}
public QueryBuilder addQuery(String key, String value) {
if (!query.isEmpty()) {
query.append('&');
}
query.append(URLEncoder.encode(key, StandardCharsets.UTF_8))
.append('=')
.append(URLEncoder.encode(value, StandardCharsets.UTF_8));
return this;
}
public String toUriString() {
if (uri != null) {
if (query. isEmpty()) {
return uri;
}
return uri + '?' + query;
}
return toQueryString();
}
public String toQueryString() {
return query.toString();
}
@Override
public String toString() {
return toUriString();
}
}

View file

@ -0,0 +1,97 @@
package pro.gravit.launchserver.auth.core.openid;
import pro.gravit.launchserver.auth.SQLSourceConfig;
import pro.gravit.utils.helper.LogHelper;
import java.sql.SQLException;
import java.util.UUID;
public class SQLServerSessionStore implements ServerSessionStore {
private static final String CREATE_TABLE = """
create table if not exists `gravit_server_session` (
id int auto_increment,
uuid varchar(36),
username varchar(255),
server_id varchar(41),
primary key (id),
unique (uuid),
unique (username)
);
""";
private static final String DELETE_SERVER_ID = """
delete from `gravit_server_session` where uuid = ?
""";
private static final String INSERT_SERVER_ID = """
insert into `gravit_server_session` (uuid, username, server_id) values (?, ?, ?)
""";
private static final String SELECT_SERVER_ID_BY_USERNAME = """
select server_id from `gravit_server_session` where username = ?
""";
private final SQLSourceConfig sqlSourceConfig;
public SQLServerSessionStore(SQLSourceConfig sqlSourceConfig) {
this.sqlSourceConfig = sqlSourceConfig;
}
@Override
public boolean joinServer(UUID uuid, String username, String serverId) {
try (var connection = sqlSourceConfig.getConnection()) {
connection.setAutoCommit(false);
var savepoint = connection.setSavepoint();
try (var deleteServerIdStmt = connection.prepareStatement(DELETE_SERVER_ID);
var insertServerIdStmt = connection.prepareStatement(INSERT_SERVER_ID)) {
deleteServerIdStmt.setString(1, uuid.toString());
deleteServerIdStmt.execute();
insertServerIdStmt.setString(1, uuid.toString());
insertServerIdStmt.setString(2, username);
insertServerIdStmt.setString(3, serverId);
insertServerIdStmt.execute();
connection.commit();
return true;
} catch (Exception e) {
connection.rollback(savepoint);
throw e;
}
} catch (SQLException e) {
LogHelper.debug("Can't join server. Username: %s".formatted(username));
LogHelper.error(e);
}
return false;
}
@Override
public String getServerIdByUsername(String username) {
try (var connection = sqlSourceConfig.getConnection();
var selectServerId = connection.prepareStatement(SELECT_SERVER_ID_BY_USERNAME)) {
selectServerId.setString(1, username);
try (var rs = selectServerId.executeQuery()) {
if (!rs.next()) {
return null;
}
return rs.getString("server_id");
}
} catch (SQLException e) {
LogHelper.debug("Can't find server id by username. Username: %s".formatted(username));
LogHelper.error(e);
}
return null;
}
public void init() {
try (var connection = sqlSourceConfig.getConnection()) {
connection.setAutoCommit(false);
var savepoint = connection.setSavepoint();
try (var createTableStmt = connection.prepareStatement(CREATE_TABLE)) {
createTableStmt.execute();
connection.commit();
} catch (Exception e) {
connection.rollback(savepoint);
throw e;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,124 @@
package pro.gravit.launchserver.auth.core.openid;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launchserver.auth.HikariSQLSourceConfig;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.utils.helper.LogHelper;
import java.sql.SQLException;
import java.util.UUID;
public class SQLUserStore implements UserStore {
private static final String CREATE_USER_TABLE = """
create table if not exists `gravit_user` (
id int auto_increment,
uuid varchar(36),
username varchar(255),
primary key (id),
unique (uuid),
unique (username)
)
""";
private static final String INSERT_USER = """
insert into `gravit_user` (uuid, username) values (?, ?)
""";
private static final String DELETE_USER_BY_NAME = """
delete `gravit_user` where username = ?
""";
private static final String SELECT_USER_BY_NAME = """
select uuid, username from `gravit_user` where username = ?
""";
private static final String SELECT_USER_BY_UUID = """
select uuid, username from `gravit_user` where uuid = ?
""";
private final HikariSQLSourceConfig sqlSourceConfig;
public SQLUserStore(HikariSQLSourceConfig sqlSourceConfig) {
this.sqlSourceConfig = sqlSourceConfig;
}
@Override
public User getByUsername(String username) {
try (var connection = sqlSourceConfig.getConnection();
var selectUserStmt = connection.prepareStatement(SELECT_USER_BY_NAME)) {
selectUserStmt.setString(1, username);
try (var rs = selectUserStmt.executeQuery()) {
if (!rs.next()) {
LogHelper.debug("User not found, username: %s".formatted(username));
return null;
}
return new UserEntity(rs.getString("username"),
UUID.fromString(rs.getString("uuid")),
new ClientPermissions());
}
} catch (SQLException e) {
LogHelper.error(e);
}
return null;
}
@Override
public User getUserByUUID(UUID uuid) {
try (var connection = sqlSourceConfig.getConnection();
var selectUserStmt = connection.prepareStatement(SELECT_USER_BY_UUID)) {
selectUserStmt.setString(1, uuid.toString());
try (var rs = selectUserStmt.executeQuery()) {
if (!rs.next()) {
LogHelper.debug("User not found, UUID: %s".formatted(uuid));
return null;
}
return new UserEntity(rs.getString("username"),
UUID.fromString(rs.getString("uuid")),
new ClientPermissions());
}
} catch (SQLException e) {
LogHelper.error(e);
}
return null;
}
@Override
public void createOrUpdateUser(User user) {
try (var connection = sqlSourceConfig.getConnection()) {
connection.setAutoCommit(false);
var savepoint = connection.setSavepoint();
try (var deleteUserStmt = connection.prepareStatement(DELETE_USER_BY_NAME);
var insertUserStmt = connection.prepareStatement(INSERT_USER)) {
deleteUserStmt.setString(1, user.getUsername());
deleteUserStmt.execute();
insertUserStmt.setString(1, user.getUUID().toString());
insertUserStmt.setString(2, user.getUsername());
insertUserStmt.execute();
connection.commit();
LogHelper.debug("User saved. UUID: %s, username: %s".formatted(user.getUUID(), user.getUsername()));
} catch (Exception e) {
connection.rollback(savepoint);
throw e;
}
} catch (SQLException e) {
LogHelper.debug("Failed to save user");
LogHelper.error(e);
throw new RuntimeException("Failed to save user", e);
}
}
public void init() {
try (var connection = sqlSourceConfig.getConnection()) {
connection.setAutoCommit(false);
var savepoint = connection.setSavepoint();
try (var createUserTableStmt = connection.prepareStatement(CREATE_USER_TABLE)) {
createUserTableStmt.execute();
connection.commit();
} catch (Exception e) {
connection.rollback(savepoint);
throw e;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,8 @@
package pro.gravit.launchserver.auth.core.openid;
import java.util.UUID;
public interface ServerSessionStore {
boolean joinServer(UUID uuid, String username, String serverId);
String getServerIdByUsername(String username);
}

View file

@ -0,0 +1,5 @@
package pro.gravit.launchserver.auth.core.openid;
public record TokenResponse(String accessToken, long accessTokenExpiresIn,
String refreshToken, long refreshTokenExpiresIn) {
}

View file

@ -0,0 +1,23 @@
package pro.gravit.launchserver.auth.core.openid;
import pro.gravit.launcher.base.ClientPermissions;
import pro.gravit.launchserver.auth.core.User;
import java.util.UUID;
record UserEntity(String username, UUID uuid, ClientPermissions permissions) implements User {
@Override
public String getUsername() {
return username;
}
@Override
public UUID getUUID() {
return uuid;
}
@Override
public ClientPermissions getPermissions() {
return permissions;
}
}

View file

@ -0,0 +1,13 @@
package pro.gravit.launchserver.auth.core.openid;
import pro.gravit.launchserver.auth.core.User;
import java.util.UUID;
public interface UserStore {
User getByUsername(String username);
User getUserByUUID(UUID uuid);
void createOrUpdateUser(User user);
}

View file

@ -0,0 +1,31 @@
package pro.gravit.launchserver.auth.mix;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.utils.ProviderMap;
public abstract class MixProvider implements AutoCloseable{
public static final ProviderMap<MixProvider> providers = new ProviderMap<>("MixProvider");
private static final Logger logger = LogManager.getLogger();
private static boolean registredProviders = false;
public static void registerProviders() {
if (!registredProviders) {
providers.register("uploadAsset", UploadAssetMixProvider.class);
registredProviders = true;
}
}
public abstract void init(LaunchServer server, AuthCoreProvider core);
@SuppressWarnings("unchecked")
public <T> T isSupport(Class<T> clazz) {
if (clazz.isAssignableFrom(getClass())) return (T) this;
return null;
}
@Override
public abstract void close();
}

View file

@ -0,0 +1,34 @@
package pro.gravit.launchserver.auth.mix;
import pro.gravit.launcher.base.events.request.AssetUploadInfoRequestEvent;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.core.AuthCoreProvider;
import pro.gravit.launchserver.auth.core.User;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportAssetUpload;
import java.util.Map;
public class UploadAssetMixProvider extends MixProvider implements AuthSupportAssetUpload {
public Map<String, String> urls;
public AssetUploadInfoRequestEvent.SlimSupportConf slimSupportConf;
@Override
public String getAssetUploadUrl(String name, User user) {
return urls.get(name);
}
@Override
public AssetUploadInfoRequestEvent getAssetUploadInfo(User user) {
return new AssetUploadInfoRequestEvent(urls.keySet(), slimSupportConf);
}
@Override
public void init(LaunchServer server, AuthCoreProvider core) {
}
@Override
public void close() {
}
}

View file

@ -0,0 +1,13 @@
package pro.gravit.launchserver.auth.password;
public class AcceptPasswordVerifier extends PasswordVerifier {
@Override
public boolean check(String encryptedPassword, String password) {
return true;
}
@Override
public String encrypt(String password) {
return "";
}
}

View file

@ -0,0 +1,18 @@
package pro.gravit.launchserver.auth.password;
import org.bouncycastle.crypto.generators.OpenBSDBCrypt;
import pro.gravit.utils.helper.SecurityHelper;
public class BCryptPasswordVerifier extends PasswordVerifier {
public int cost = 10;
@Override
public boolean check(String encryptedPassword, String password) {
return OpenBSDBCrypt.checkPassword(encryptedPassword, password.toCharArray());
}
@Override
public String encrypt(String password) {
return OpenBSDBCrypt.generate(password.toCharArray(), SecurityHelper.randomBytes(16), cost);
}
}

View file

@ -0,0 +1,41 @@
package pro.gravit.launchserver.auth.password;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.SecurityHelper;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class DigestPasswordVerifier extends PasswordVerifier {
private transient final Logger logger = LogManager.getLogger();
public String algo;
private byte[] digest(String text) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance(algo);
return digest.digest(IOHelper.encode(text));
}
@Override
public boolean check(String encryptedPassword, String password) {
try {
byte[] bytes = SecurityHelper.fromHex(encryptedPassword);
return Arrays.equals(bytes, digest(password));
} catch (NoSuchAlgorithmException e) {
logger.error("Digest algorithm {} not supported", algo);
return false;
}
}
@Override
public String encrypt(String password) {
try {
return SecurityHelper.toHex(digest(password));
} catch (NoSuchAlgorithmException e) {
logger.error("Digest algorithm {} not supported", algo);
return null;
}
}
}

View file

@ -0,0 +1,43 @@
package pro.gravit.launchserver.auth.password;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.SecurityHelper;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class DoubleDigestPasswordVerifier extends PasswordVerifier {
private transient final Logger logger = LogManager.getLogger();
public String algo;
public boolean toHexMode;
private byte[] digest(String text) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance(algo);
byte[] firstDigest = digest.digest(IOHelper.encode(text));
return toHexMode ? digest.digest(IOHelper.encode(SecurityHelper.toHex(firstDigest))) : digest.digest(firstDigest);
}
@Override
public boolean check(String encryptedPassword, String password) {
try {
byte[] bytes = SecurityHelper.fromHex(encryptedPassword);
return Arrays.equals(bytes, digest(password));
} catch (NoSuchAlgorithmException e) {
logger.error("Digest algorithm {} not supported", algo);
return false;
}
}
@Override
public String encrypt(String password) {
try {
return SecurityHelper.toHex(digest(password));
} catch (NoSuchAlgorithmException e) {
logger.error("Digest algorithm {} not supported", algo);
return null;
}
}
}

View file

@ -0,0 +1,81 @@
package pro.gravit.launchserver.auth.password;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.Launcher;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class JsonPasswordVerifier extends PasswordVerifier {
private static final Logger logger = LogManager.getLogger();
private transient final HttpClient client = HttpClient.newBuilder().build();
public String url;
public String bearerToken;
public static <T, R> R jsonRequest(T request, String url, String bearerToken, Class<R> clazz, HttpClient client) {
HttpRequest.BodyPublisher publisher;
if (request != null) {
publisher = HttpRequest.BodyPublishers.ofString(Launcher.gsonManager.gson.toJson(request));
} else {
publisher = HttpRequest.BodyPublishers.noBody();
}
try {
HttpRequest.Builder request1 = HttpRequest.newBuilder()
.method("POST", publisher)
.uri(new URI(url))
.header("Content-Type", "application/json; charset=UTF-8")
.header("Accept", "application/json")
.timeout(Duration.ofMillis(10000));
if (bearerToken != null) {
request1.header("Authorization", "Bearer ".concat(bearerToken));
}
HttpResponse<InputStream> response = client.send(request1.build(), HttpResponse.BodyHandlers.ofInputStream());
int statusCode = response.statusCode();
if (200 > statusCode || statusCode > 300) {
if (statusCode >= 500) {
logger.error("JsonCoreProvider: {} return {}", url, statusCode);
} else if (statusCode >= 300 && statusCode <= 400) {
logger.error("JsonCoreProvider: {} return {}, try redirect to {}. Redirects not supported!", url, statusCode, response.headers().firstValue("Location").orElse("Unknown"));
} else if (statusCode == 403 || statusCode == 401) {
logger.error("JsonCoreProvider: {} return {}. Please set 'bearerToken'!", url, statusCode);
}
return null;
}
try (Reader reader = new InputStreamReader(response.body())) {
return Launcher.gsonManager.gson.fromJson(reader, clazz);
}
} catch (Exception e) {
return null;
}
}
@Override
public boolean check(String encryptedPassword, String password) {
JsonPasswordResponse response = jsonRequest(new JsonPasswordRequest(encryptedPassword, password), url, bearerToken, JsonPasswordResponse.class, client);
if (response != null) {
return response.success;
}
return false;
}
public static class JsonPasswordRequest {
public String encryptedPassword;
public String password;
public JsonPasswordRequest(String encryptedPassword, String password) {
this.encryptedPassword = encryptedPassword;
this.password = password;
}
}
public static class JsonPasswordResponse {
public boolean success;
}
}

View file

@ -0,0 +1,27 @@
package pro.gravit.launchserver.auth.password;
import pro.gravit.utils.ProviderMap;
public abstract class PasswordVerifier {
public static final ProviderMap<PasswordVerifier> providers = new ProviderMap<>("PasswordVerifier");
private static boolean registeredProviders = false;
public static void registerProviders() {
if (!registeredProviders) {
providers.register("plain", PlainPasswordVerifier.class);
providers.register("digest", DigestPasswordVerifier.class);
providers.register("doubleDigest", DoubleDigestPasswordVerifier.class);
providers.register("json", JsonPasswordVerifier.class);
providers.register("bcrypt", BCryptPasswordVerifier.class);
providers.register("accept", AcceptPasswordVerifier.class);
providers.register("reject", RejectPasswordVerifier.class);
registeredProviders = true;
}
}
public abstract boolean check(String encryptedPassword, String password);
public String encrypt(String password) {
throw new UnsupportedOperationException();
}
}

View file

@ -0,0 +1,13 @@
package pro.gravit.launchserver.auth.password;
public class PlainPasswordVerifier extends PasswordVerifier {
@Override
public boolean check(String encryptedPassword, String password) {
return encryptedPassword.equals(password);
}
@Override
public String encrypt(String password) {
return super.encrypt(password);
}
}

View file

@ -0,0 +1,8 @@
package pro.gravit.launchserver.auth.password;
public class RejectPasswordVerifier extends PasswordVerifier {
@Override
public boolean check(String encryptedPassword, String password) {
return false;
}
}

View file

@ -0,0 +1,108 @@
package pro.gravit.launchserver.auth.profiles;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.utils.helper.IOHelper;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
public class LocalProfileProvider extends ProfileProvider {
public String profilesDir = "profiles";
private transient volatile Map<Path, ClientProfile> profilesMap;
private transient volatile Set<ClientProfile> profilesList; // Cache
@Override
public void sync() throws IOException {
Path profilesDirPath = Path.of(profilesDir);
if (!IOHelper.isDir(profilesDirPath))
Files.createDirectory(profilesDirPath);
Map<Path, ClientProfile> newProfiles = new HashMap<>();
IOHelper.walk(profilesDirPath, new ProfilesFileVisitor(newProfiles), false);
Set<ClientProfile> newProfilesList = new HashSet<>(newProfiles.values());
profilesMap = newProfiles;
profilesList = newProfilesList;
}
@Override
public Set<ClientProfile> getProfiles() {
return profilesList;
}
@Override
public void addProfile(ClientProfile profile) throws IOException {
Path profilesDirPath = Path.of(profilesDir);
ClientProfile oldProfile;
Path target = null;
for(var e : profilesMap.entrySet()) {
if(e.getValue().getUUID().equals(profile.getUUID())) {
target = e.getKey();
}
}
if(target == null) {
target = profilesDirPath.resolve(profile.getTitle()+".json");
oldProfile = profilesMap.get(target);
if(oldProfile != null && !oldProfile.getUUID().equals(profile.getUUID())) {
throw new FileAlreadyExistsException(target.toString());
}
}
try (BufferedWriter writer = IOHelper.newWriter(target)) {
Launcher.gsonManager.configGson.toJson(profile, writer);
}
addProfile(target, profile);
}
@Override
public void deleteProfile(ClientProfile profile) throws IOException {
for(var e : profilesMap.entrySet()) {
if(e.getValue().getUUID().equals(profile.getUUID())) {
Files.deleteIfExists(e.getKey());
profilesMap.remove(e.getKey());
profilesList.remove(e.getValue());
break;
}
}
}
private void addProfile(Path path, ClientProfile profile) {
for(var e : profilesMap.entrySet()) {
if(e.getValue().getUUID().equals(profile.getUUID())) {
profilesMap.remove(e.getKey());
profilesList.remove(e.getValue());
break;
}
}
profilesMap.put(path, profile);
profilesList.add(profile);
}
private static final class ProfilesFileVisitor extends SimpleFileVisitor<Path> {
private final Map<Path, ClientProfile> result;
private final Logger logger = LogManager.getLogger();
private ProfilesFileVisitor(Map<Path, ClientProfile> result) {
this.result = result;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
logger.info("Syncing '{}' profile", IOHelper.getFileName(file));
// Read profile
ClientProfile profile;
try (BufferedReader reader = IOHelper.newReader(file)) {
profile = Launcher.gsonManager.gson.fromJson(reader, ClientProfile.class);
}
profile.verify();
// Add SIGNED profile to result list
result.put(file.toAbsolutePath(), profile);
return super.visitFile(file, attrs);
}
}
}

View file

@ -0,0 +1,76 @@
package pro.gravit.launchserver.auth.profiles;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.protect.interfaces.ProfilesProtectHandler;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.utils.ProviderMap;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public abstract class ProfileProvider {
public static final ProviderMap<ProfileProvider> providers = new ProviderMap<>("ProfileProvider");
private static boolean registredProviders = false;
protected transient LaunchServer server;
public static void registerProviders() {
if (!registredProviders) {
providers.register("local", LocalProfileProvider.class);
registredProviders = true;
}
}
public void init(LaunchServer server) {
this.server = server;
}
public abstract void sync() throws IOException;
public abstract Set<ClientProfile> getProfiles();
public abstract void addProfile(ClientProfile profile) throws IOException;
public abstract void deleteProfile(ClientProfile profile) throws IOException;
public void close() {
}
public ClientProfile getProfile(UUID uuid) {
for(var e : getProfiles()) {
if(e.getUUID().equals(uuid)) {
return e;
}
}
return null;
}
public ClientProfile getProfile(String title) {
for(var e : getProfiles()) {
if(e.getTitle().equals(title)) {
return e;
}
}
return null;
}
public List<ClientProfile> getProfiles(Client client) {
List<ClientProfile> profileList;
Set<ClientProfile> serverProfiles = getProfiles();
if (server.config.protectHandler instanceof ProfilesProtectHandler protectHandler) {
profileList = new ArrayList<>(4);
for (ClientProfile profile : serverProfiles) {
if (protectHandler.canGetProfile(profile, client)) {
profileList.add(profile);
}
}
} else {
profileList = List.copyOf(serverProfiles);
}
return profileList;
}
}

View file

@ -0,0 +1,189 @@
package pro.gravit.launchserver.auth.protect;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.events.request.GetSecureLevelInfoRequestEvent;
import pro.gravit.launcher.base.events.request.HardwareReportRequestEvent;
import pro.gravit.launcher.base.events.request.VerifySecureLevelKeyRequestEvent;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.AuthProviderPair;
import pro.gravit.launchserver.auth.core.interfaces.UserHardware;
import pro.gravit.launchserver.auth.core.interfaces.provider.AuthSupportHardware;
import pro.gravit.launchserver.auth.protect.interfaces.HardwareProtectHandler;
import pro.gravit.launchserver.auth.protect.interfaces.JoinServerProtectHandler;
import pro.gravit.launchserver.auth.protect.interfaces.SecureProtectHandler;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.RestoreResponse;
import pro.gravit.launchserver.socket.response.secure.HardwareReportResponse;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;
import static java.util.concurrent.TimeUnit.SECONDS;
public class AdvancedProtectHandler extends StdProtectHandler implements SecureProtectHandler, HardwareProtectHandler, JoinServerProtectHandler {
private transient final Logger logger = LogManager.getLogger();
public boolean enableHardwareFeature;
private transient LaunchServer server;
@Override
public GetSecureLevelInfoRequestEvent onGetSecureLevelInfo(GetSecureLevelInfoRequestEvent event) {
return event;
}
@Override
public boolean allowGetSecureLevelInfo(Client client) {
return client.checkSign;
}
@Override
public void onHardwareReport(HardwareReportResponse response, Client client) {
if (!enableHardwareFeature) {
response.sendResult(new HardwareReportRequestEvent());
return;
}
if (!client.isAuth || client.trustLevel == null || client.trustLevel.publicKey == null) {
response.sendError("Access denied");
return;
}
if(client.trustLevel.hardwareInfo != null) {
response.sendResult(new HardwareReportRequestEvent(createHardwareToken(client.username, client.trustLevel.hardwareInfo), SECONDS.toMillis(server.config.netty.security.hardwareTokenExpire)));
return;
}
logger.debug("HardwareInfo received");
{
var authSupportHardware = client.auth.isSupport(AuthSupportHardware.class);
if (authSupportHardware != null) {
UserHardware hardware = authSupportHardware.getHardwareInfoByData(response.hardware);
if (hardware == null) {
hardware = authSupportHardware.createHardwareInfo(response.hardware, client.trustLevel.publicKey);
} else {
authSupportHardware.addPublicKeyToHardwareInfo(hardware, client.trustLevel.publicKey);
}
authSupportHardware.connectUserAndHardware(client.sessionObject, hardware);
if (hardware.isBanned()) {
throw new SecurityException("Your hardware banned");
}
client.trustLevel.hardwareInfo = hardware;
response.sendResult(new HardwareReportRequestEvent(createHardwareToken(client.username, hardware), SECONDS.toMillis(server.config.netty.security.hardwareTokenExpire)));
} else {
logger.error("AuthCoreProvider not supported hardware");
response.sendError("AuthCoreProvider not supported hardware");
}
}
}
@Override
public VerifySecureLevelKeyRequestEvent onSuccessVerify(Client client) {
if (enableHardwareFeature) {
var authSupportHardware = client.auth.isSupport(AuthSupportHardware.class);
if (authSupportHardware != null) {
UserHardware hardware = authSupportHardware.getHardwareInfoByPublicKey(client.trustLevel.publicKey);
if (hardware == null) //HWID not found?
return new VerifySecureLevelKeyRequestEvent(true, false, createPublicKeyToken(client.username, client.trustLevel.publicKey), SECONDS.toMillis(server.config.netty.security.publicKeyTokenExpire));
if (hardware.isBanned()) {
throw new SecurityException("Your hardware banned");
}
client.trustLevel.hardwareInfo = hardware;
authSupportHardware.connectUserAndHardware(client.sessionObject, hardware);
return new VerifySecureLevelKeyRequestEvent(false, false, createPublicKeyToken(client.username, client.trustLevel.publicKey), SECONDS.toMillis(server.config.netty.security.publicKeyTokenExpire));
} else {
logger.warn("AuthCoreProvider not supported hardware. HardwareInfo not checked!");
}
}
return new VerifySecureLevelKeyRequestEvent(false, false, createPublicKeyToken(client.username, client.trustLevel.publicKey), SECONDS.toMillis(server.config.netty.security.publicKeyTokenExpire));
}
@Override
public boolean onJoinServer(String serverID, String username, UUID uuid, Client client) {
return !enableHardwareFeature || (client.trustLevel != null && client.trustLevel.hardwareInfo != null);
}
@Override
public void init(LaunchServer server) {
this.server = server;
}
public String createHardwareToken(String username, UserHardware hardware) {
return Jwts.builder()
.setIssuer("LaunchServer")
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + SECONDS.toMillis(server.config.netty.security.hardwareTokenExpire)))
.claim("hardware", hardware.getId())
.signWith(server.keyAgreementManager.ecdsaPrivateKey)
.compact();
}
public String createPublicKeyToken(String username, byte[] publicKey) {
return Jwts.builder()
.setIssuer("LaunchServer")
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + SECONDS.toMillis(server.config.netty.security.publicKeyTokenExpire)))
.claim("publicKey", Base64.getEncoder().encodeToString(publicKey))
.signWith(server.keyAgreementManager.ecdsaPrivateKey)
.compact();
}
public static class HardwareInfoTokenVerifier implements RestoreResponse.ExtendedTokenProvider {
private transient final Logger logger = LogManager.getLogger();
private final JwtParser parser;
public HardwareInfoTokenVerifier(LaunchServer server) {
this.parser = Jwts.parser()
.requireIssuer("LaunchServer")
.verifyWith(server.keyAgreementManager.ecdsaPublicKey)
.build();
}
@Override
public boolean accept(Client client, AuthProviderPair pair, String extendedToken) {
try {
var parse = parser.parseClaimsJws(extendedToken);
String hardwareInfoId = parse.getBody().get("hardware", String.class);
if (hardwareInfoId == null) return false;
if (client.auth == null) return false;
var hardwareSupport = client.auth.core.isSupport(AuthSupportHardware.class);
if (hardwareSupport == null) return false;
UserHardware hardware = hardwareSupport.getHardwareInfoById(hardwareInfoId);
if (client.trustLevel == null) client.trustLevel = new Client.TrustLevel();
client.trustLevel.hardwareInfo = hardware;
return true;
} catch (Throwable e) {
logger.error("Hardware JWT error", e);
}
return false;
}
}
public static class PublicKeyTokenVerifier implements RestoreResponse.ExtendedTokenProvider {
private transient final Logger logger = LogManager.getLogger();
private final JwtParser parser;
public PublicKeyTokenVerifier(LaunchServer server) {
this.parser = Jwts.parser()
.requireIssuer("LaunchServer")
.verifyWith(server.keyAgreementManager.ecdsaPublicKey)
.build();
}
@Override
public boolean accept(Client client, AuthProviderPair pair, String extendedToken) {
try {
var parse = parser.parseClaimsJws(extendedToken);
String publicKey = parse.getBody().get("publicKey", String.class);
if (publicKey == null) return false;
if (client.trustLevel == null) client.trustLevel = new Client.TrustLevel();
client.trustLevel.publicKey = Base64.getDecoder().decode(publicKey);
return true;
} catch (Throwable e) {
logger.error("Public Key JWT error", e);
}
return false;
}
}
}

View file

@ -0,0 +1,17 @@
package pro.gravit.launchserver.auth.protect;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
public class NoProtectHandler extends ProtectHandler {
@Override
public boolean allowGetAccessToken(AuthResponse.AuthContext context) {
return true;
}
@Override
public boolean allowJoinServer(Client client) {
return true;
}
}

View file

@ -0,0 +1,35 @@
package pro.gravit.launchserver.auth.protect;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import pro.gravit.utils.ProviderMap;
public abstract class ProtectHandler {
public static final ProviderMap<ProtectHandler> providers = new ProviderMap<>("ProtectHandler");
private static boolean registredHandl = false;
public static void registerHandlers() {
if (!registredHandl) {
providers.register("none", NoProtectHandler.class);
providers.register("std", StdProtectHandler.class);
providers.register("advanced", AdvancedProtectHandler.class);
registredHandl = true;
}
}
public abstract boolean allowGetAccessToken(AuthResponse.AuthContext context);
public boolean allowJoinServer(Client client) {
return client.isAuth && client.type == AuthResponse.ConnectTypes.CLIENT;
}
public void init(LaunchServer server) {
}
public void close() {
}
//public abstract
}

View file

@ -0,0 +1,59 @@
package pro.gravit.launchserver.auth.protect;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.auth.protect.interfaces.ProfilesProtectHandler;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.auth.AuthResponse;
import java.util.*;
public class StdProtectHandler extends ProtectHandler implements ProfilesProtectHandler {
private transient final Logger logger = LogManager.getLogger();
public Map<String, List<String>> profileWhitelist = new HashMap<>();
public List<String> allowUpdates = new ArrayList<>();
@Override
public boolean allowGetAccessToken(AuthResponse.AuthContext context) {
return (context.authType == AuthResponse.ConnectTypes.CLIENT) && context.client.checkSign;
}
@Override
public void init(LaunchServer server) {
if (profileWhitelist != null && !profileWhitelist.isEmpty()) {
logger.warn("profileWhitelist deprecated. Please use permission 'launchserver.profile.PROFILE_UUID.show' and 'launchserver.profile.PROFILE_UUID.enter'");
}
}
@Override
public boolean canGetProfile(ClientProfile profile, Client client) {
return (client.isAuth && !profile.isLimited()) || isWhitelisted("launchserver.profile.%s.show", profile, client);
}
@Override
public boolean canChangeProfile(ClientProfile profile, Client client) {
return (client.isAuth && !profile.isLimited()) || isWhitelisted("launchserver.profile.%s.enter", profile, client);
}
@Override
public boolean canGetUpdates(String updatesDirName, Client client) {
return client.profile != null && (client.profile.getDir().equals(updatesDirName) || client.profile.getAssetDir().equals(updatesDirName) || allowUpdates.contains(updatesDirName));
}
private boolean isWhitelisted(String property, ClientProfile profile, Client client) {
if (client.permissions != null) {
String permByUUID = property.formatted(profile.getUUID());
if (client.permissions.hasPerm(permByUUID)) {
return true;
}
String permByTitle = property.formatted(profile.getTitle().toLowerCase(Locale.ROOT));
if (client.permissions.hasPerm(permByTitle)) {
return true;
}
}
List<String> allowedUsername = profileWhitelist.get(profile.getTitle());
return allowedUsername != null && allowedUsername.contains(client.username);
}
}

View file

@ -0,0 +1,8 @@
package pro.gravit.launchserver.auth.protect.interfaces;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.secure.HardwareReportResponse;
public interface HardwareProtectHandler {
void onHardwareReport(HardwareReportResponse response, Client client);
}

View file

@ -0,0 +1,11 @@
package pro.gravit.launchserver.auth.protect.interfaces;
import pro.gravit.launchserver.socket.Client;
import java.util.UUID;
public interface JoinServerProtectHandler {
default boolean onJoinServer(String serverID, String username, UUID uuid, Client client) {
return true;
}
}

View file

@ -0,0 +1,22 @@
package pro.gravit.launchserver.auth.protect.interfaces;
import pro.gravit.launcher.base.profiles.ClientProfile;
import pro.gravit.launchserver.socket.Client;
public interface ProfilesProtectHandler {
default boolean canGetProfiles(Client client) {
return true;
}
default boolean canGetProfile(ClientProfile profile, Client client) {
return true;
}
default boolean canChangeProfile(ClientProfile profile, Client client) {
return client.isAuth;
}
default boolean canGetUpdates(String updatesDirName, Client client) {
return true;
}
}

View file

@ -0,0 +1,39 @@
package pro.gravit.launchserver.auth.protect.interfaces;
import pro.gravit.launcher.base.events.request.GetSecureLevelInfoRequestEvent;
import pro.gravit.launcher.base.events.request.SecurityReportRequestEvent;
import pro.gravit.launcher.base.events.request.VerifySecureLevelKeyRequestEvent;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.secure.SecurityReportResponse;
import pro.gravit.utils.helper.SecurityHelper;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.ECPublicKey;
import java.security.spec.InvalidKeySpecException;
public interface SecureProtectHandler {
default byte[] generateSecureLevelKey() {
return SecurityHelper.randomBytes(128);
}
default void verifySecureLevelKey(byte[] publicKey, byte[] data, byte[] signature) throws InvalidKeySpecException, SignatureException {
if (publicKey == null || signature == null) throw new InvalidKeySpecException();
ECPublicKey pubKey = SecurityHelper.toPublicECDSAKey(publicKey);
Signature sign = SecurityHelper.newECVerifySignature(pubKey);
sign.update(data);
sign.verify(signature);
}
GetSecureLevelInfoRequestEvent onGetSecureLevelInfo(GetSecureLevelInfoRequestEvent event);
boolean allowGetSecureLevelInfo(Client client);
default SecurityReportRequestEvent onSecurityReport(SecurityReportResponse report, Client client) {
return new SecurityReportRequestEvent();
}
default VerifySecureLevelKeyRequestEvent onSuccessVerify(Client client) {
return new VerifySecureLevelKeyRequestEvent();
}
}

View file

@ -0,0 +1,68 @@
package pro.gravit.launchserver.auth.texture;
import com.google.gson.reflect.TypeToken;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.profiles.Texture;
import pro.gravit.launchserver.HttpRequester;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class JsonTextureProvider extends TextureProvider {
private static final Type MAP_TYPE = new TypeToken<Map<String, JsonTexture>>() {
}.getType();
private transient final Logger logger = LogManager.getLogger();
private transient final HttpRequester requester = new HttpRequester();
public String url;
public String bearerToken;
@Override
public void close() {
//None
}
@Override
public Texture getCloakTexture(UUID uuid, String username, String client) {
logger.warn("Ineffective get cloak texture for {}", username);
return getAssets(uuid, username, client).get("CAPE");
}
@Override
public Texture getSkinTexture(UUID uuid, String username, String client) {
logger.warn("Ineffective get skin texture for {}", username);
return getAssets(uuid, username, client).get("SKIN");
}
@Override
public Map<String, Texture> getAssets(UUID uuid, String username, String client) {
try {
Map<String, JsonTexture> map = requester.<Map<String, JsonTexture>>send(requester.get(RequestTextureProvider.getTextureURL(url, uuid, username, client), bearerToken), MAP_TYPE).getOrThrow();
return JsonTexture.convertMap(map);
} catch (IOException e) {
logger.error("JsonTextureProvider", e);
return new HashMap<>();
}
}
public record JsonTexture(String url, String digest, Map<String, String> metadata) {
public Texture toTexture() {
return new Texture(url, digest == null ? null : SecurityHelper.fromHex(digest), metadata);
}
public static Map<String, Texture> convertMap(Map<String, JsonTexture> map) {
if (map == null) {
return new HashMap<>();
}
Map<String, Texture> res = new HashMap<>();
for(var e : map.entrySet()) {
res.put(e.getKey(), e.getValue().toTexture());
}
return res;
}
}
}

View file

@ -1,21 +1,15 @@
package ru.gravit.launchserver.texture;
package pro.gravit.launchserver.auth.texture;
import pro.gravit.launcher.base.profiles.Texture;
import pro.gravit.utils.helper.VerifyHelper;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
import ru.gravit.launcher.LauncherAPI;
import ru.gravit.utils.helper.VerifyHelper;
import ru.gravit.launcher.profiles.Texture;
import ru.gravit.launcher.serialize.config.entry.BlockConfigEntry;
public final class NullTextureProvider extends TextureProvider {
private volatile TextureProvider provider;
public NullTextureProvider(BlockConfigEntry block) {
super(block);
}
@Override
public void close() throws IOException {
TextureProvider provider = this.provider;
@ -37,7 +31,7 @@ public Texture getSkinTexture(UUID uuid, String username, String client) throws
return getProvider().getSkinTexture(uuid, username, client);
}
@LauncherAPI
public void setBackend(TextureProvider provider) {
this.provider = provider;
}

View file

@ -0,0 +1,78 @@
package pro.gravit.launchserver.auth.texture;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.base.profiles.Texture;
import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.IOHelper;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
public final class RequestTextureProvider extends TextureProvider {
// Instance
public String skinURL;
public String cloakURL;
public String skinLocalPath;
public String cloakLocalPath;
public RequestTextureProvider() {
}
public RequestTextureProvider(String skinURL, String cloakURL) {
this.skinURL = skinURL;
this.cloakURL = cloakURL;
}
private static Texture getTexture(String url, boolean cloak) throws IOException {
try {
return new Texture(url, cloak, null);
} catch (FileNotFoundException ignored) {
return null; // Simply not found
}
}
private static Texture getTexture(String url, Path local, boolean cloak) throws IOException {
try {
return new Texture(url, local, cloak, null);
} catch (FileNotFoundException ignored) {
return null; // Simply not found
}
}
public static String getTextureURL(String url, UUID uuid, String username, String client) {
return CommonHelper.replace(url, "username", IOHelper.urlEncode(username),
"uuid", IOHelper.urlEncode(uuid.toString()), "hash", IOHelper.urlEncode(Launcher.toHash(uuid)),
"client", IOHelper.urlEncode(client == null ? "unknown" : client));
}
@Override
public void close() {
// Do nothing
}
@Override
public Texture getCloakTexture(UUID uuid, String username, String client) throws IOException {
String textureUrl = getTextureURL(cloakURL, uuid, username, client);
if (cloakLocalPath == null) {
return getTexture(textureUrl, true);
} else {
String path = getTextureURL(cloakLocalPath, uuid, username, client);
return getTexture(textureUrl, Paths.get(path), true);
}
}
@Override
public Texture getSkinTexture(UUID uuid, String username, String client) throws IOException {
String textureUrl = getTextureURL(skinURL, uuid, username, client);
if (skinLocalPath == null) {
return getTexture(textureUrl, false);
} else {
String path = getTextureURL(skinLocalPath, uuid, username, client);
return getTexture(textureUrl, Paths.get(path), false);
}
}
}

View file

@ -0,0 +1,95 @@
package pro.gravit.launchserver.auth.texture;
import pro.gravit.launcher.base.profiles.Texture;
import pro.gravit.utils.ProviderMap;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public abstract class TextureProvider implements AutoCloseable {
public static final ProviderMap<TextureProvider> providers = new ProviderMap<>("TextureProvider");
private static boolean registredProv = false;
public static void registerProviders() {
if (!registredProv) {
providers.register("null", NullTextureProvider.class);
providers.register("void", VoidTextureProvider.class);
// Auth providers that doesn't do nothing :D
providers.register("request", RequestTextureProvider.class);
providers.register("json", JsonTextureProvider.class);
registredProv = true;
}
}
@Override
public abstract void close() throws IOException;
public abstract Texture getCloakTexture(UUID uuid, String username, String client) throws IOException;
public abstract Texture getSkinTexture(UUID uuid, String username, String client) throws IOException;
@Deprecated
public SkinAndCloakTextures getTextures(UUID uuid, String username, String client) {
Texture skin;
try {
skin = getSkinTexture(uuid, username, client);
} catch (IOException e) {
skin = null;
}
// Get cloak texture
Texture cloak;
try {
cloak = getCloakTexture(uuid, username, client);
} catch (IOException e) {
cloak = null;
}
return new SkinAndCloakTextures(skin, cloak);
}
public Map<String, Texture> getAssets(UUID uuid, String username, String client) {
Texture skin;
try {
skin = getSkinTexture(uuid, username, client);
} catch (IOException e) {
skin = null;
}
// Get cloak texture
Texture cloak;
try {
cloak = getCloakTexture(uuid, username, client);
} catch (IOException e) {
cloak = null;
}
Map<String, Texture> map = new HashMap<>();
if (skin != null) {
map.put("SKIN", skin);
}
if (cloak != null) {
map.put("CAPE", cloak);
}
return map;
}
@Deprecated
public static class SkinAndCloakTextures {
public final Texture skin;
public final Texture cloak;
public SkinAndCloakTextures(Texture skin, Texture cloak) {
this.skin = skin;
this.cloak = cloak;
}
}
}

View file

@ -1,14 +1,10 @@
package ru.gravit.launchserver.texture;
package pro.gravit.launchserver.auth.texture;
import pro.gravit.launcher.base.profiles.Texture;
import java.util.UUID;
import ru.gravit.launcher.profiles.Texture;
import ru.gravit.launcher.serialize.config.entry.BlockConfigEntry;
public final class VoidTextureProvider extends TextureProvider {
public VoidTextureProvider(BlockConfigEntry block) {
super(block);
}
@Override
public void close() {

View file

@ -0,0 +1,186 @@
package pro.gravit.launchserver.auth.updates;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.core.hasher.HashedDir;
import pro.gravit.launcher.core.serialize.HInput;
import pro.gravit.launcher.core.serialize.HOutput;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.modules.events.LaunchServerUpdatesSyncEvent;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.*;
import java.util.stream.Stream;
public class LocalUpdatesProvider extends UpdatesProvider {
private final transient Logger logger = LogManager.getLogger();
public String cacheFile = ".updates-cache";
public String updatesDir = "updates";
public boolean cacheUpdates = true;
private volatile transient Map<String, HashedDir> updatesDirMap;
private void writeCache(Path file) throws IOException {
try (HOutput output = new HOutput(IOHelper.newOutput(file))) {
output.writeLength(updatesDirMap.size(), 0);
for (Map.Entry<String, HashedDir> entry : updatesDirMap.entrySet()) {
output.writeString(entry.getKey(), 0);
entry.getValue().write(output);
}
}
logger.debug("Saved {} updates to cache", updatesDirMap.size());
}
private void readCache(Path file) throws IOException {
Map<String, HashedDir> updatesDirMap = new HashMap<>(16);
try (HInput input = new HInput(IOHelper.newInput(file))) {
int size = input.readLength(0);
for (int i = 0; i < size; ++i) {
String name = input.readString(0);
HashedDir dir = new HashedDir(input);
updatesDirMap.put(name, dir);
}
}
logger.debug("Found {} updates from cache", updatesDirMap.size());
this.updatesDirMap = Collections.unmodifiableMap(updatesDirMap);
}
public void readUpdatesFromCache() throws IOException {
readCache(Path.of(cacheFile));
}
public void readUpdatesDir() throws IOException {
var cacheFilePath = Path.of(cacheFile);
if (cacheUpdates) {
if (Files.exists(cacheFilePath)) {
try {
readCache(cacheFilePath);
return;
} catch (Throwable e) {
logger.error("Read updates cache failed", e);
}
}
}
sync(null);
}
@Override
public void init(LaunchServer server) {
super.init(server);
try {
if (!IOHelper.isDir(Path.of(updatesDir)))
Files.createDirectory(Path.of(updatesDir));
} catch (IOException e) {
logger.error("Updates not synced", e);
}
}
@Override
public void syncInitially() throws IOException {
readUpdatesDir();
}
public void sync(Collection<String> dirs) throws IOException {
logger.info("Syncing updates dir");
Map<String, HashedDir> newUpdatesDirMap = new HashMap<>(16);
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(Path.of(updatesDir))) {
for (final Path updateDir : dirStream) {
if (Files.isHidden(updateDir))
continue; // Skip hidden
// Resolve name and verify is dir
String name = IOHelper.getFileName(updateDir);
if (!IOHelper.isDir(updateDir)) {
if (!IOHelper.isFile(updateDir) && Stream.of(".jar", ".exe", ".hash").noneMatch(e -> updateDir.toString().endsWith(e)))
logger.warn("Not update dir: '{}'", name);
continue;
}
// Add from previous map (it's guaranteed to be non-null)
if (dirs != null && !dirs.contains(name)) {
HashedDir hdir = updatesDirMap.get(name);
if (hdir != null) {
newUpdatesDirMap.put(name, hdir);
continue;
}
}
// Sync and sign update dir
logger.info("Syncing '{}' update dir", name);
HashedDir updateHDir = new HashedDir(updateDir, null, true, true);
newUpdatesDirMap.put(name, updateHDir);
}
}
updatesDirMap = Collections.unmodifiableMap(newUpdatesDirMap);
if (cacheUpdates) {
try {
writeCache(Path.of(cacheFile));
} catch (Throwable e) {
logger.error("Write updates cache failed", e);
}
}
server.modulesManager.invokeEvent(new LaunchServerUpdatesSyncEvent(server));
}
@Override
public HashedDir getUpdatesDir(String updateName) {
return updatesDirMap.get(updateName);
}
private Path resolveUpdateName(String updateName) {
if(updateName == null) {
return Path.of(updatesDir);
}
return Path.of(updatesDir).resolve(updateName);
}
@Override
public void upload(String updateName, Map<String, Path> files, boolean deleteAfterUpload) throws IOException {
var path = resolveUpdateName(updateName);
for(var e : files.entrySet()) {
var target = path.resolve(e.getKey());
var source = e.getValue();
IOHelper.createParentDirs(target);
if(deleteAfterUpload) {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} else {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
}
}
}
@Override
public Map<String, Path> download(String updateName, List<String> files) {
var path = resolveUpdateName(updateName);
Map<String, Path> map = new HashMap<>();
for(var e : files) {
map.put(e, path.resolve(e));
}
return map;
}
@Override
public void delete(String updateName, List<String> files) throws IOException {
var path = resolveUpdateName(updateName);
for(var e : files) {
var target = path.resolve(e);
Files.delete(target);
}
}
@Override
public void delete(String updateName) throws IOException {
var path = resolveUpdateName(updateName);
IOHelper.deleteDir(path, true);
}
@Override
public void create(String updateName) throws IOException {
var path = resolveUpdateName(updateName);
Files.createDirectories(path);
}
}

View file

@ -0,0 +1,52 @@
package pro.gravit.launchserver.auth.updates;
import pro.gravit.launcher.core.hasher.HashedDir;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.ProviderMap;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public abstract class UpdatesProvider {
public static final ProviderMap<UpdatesProvider> providers = new ProviderMap<>("UpdatesProvider");
private static boolean registredProviders = false;
protected transient LaunchServer server;
public static void registerProviders() {
if (!registredProviders) {
providers.register("local", LocalUpdatesProvider.class);
registredProviders = true;
}
}
public void init(LaunchServer server) {
this.server = server;
}
public void sync() throws IOException {
sync(null);
}
public abstract void syncInitially() throws IOException;
public abstract void sync(Collection<String> updateNames) throws IOException;
public abstract HashedDir getUpdatesDir(String updateName);
public abstract void upload(String updateName, Map<String, Path> files, boolean deleteAfterUpload) throws IOException;
public abstract Map<String, Path> download(String updateName, List<String> files);
public abstract void delete(String updateName, List<String> files) throws IOException;
public abstract void delete(String updateName) throws IOException;
public abstract void create(String updateName) throws IOException;
public void close() {
}
}

View file

@ -0,0 +1,96 @@
package pro.gravit.launchserver.binary;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launchserver.binary.tasks.LauncherBuildTask;
import pro.gravit.utils.helper.CommonHelper;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public abstract class BinaryPipeline {
public final List<LauncherBuildTask> tasks = new ArrayList<>();
public final Path buildDir;
public final String nameFormat;
protected transient final Logger logger = LogManager.getLogger();
public BinaryPipeline(Path buildDir, String nameFormat) {
this.buildDir = buildDir;
this.nameFormat = nameFormat;
}
public void addCounted(int count, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
List<LauncherBuildTask> indexes = new ArrayList<>();
tasks.stream().filter(pred).forEach(indexes::add);
indexes.forEach(e -> tasks.add(tasks.indexOf(e) + count, taskAdd));
}
public void replaceCounted(int count, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
List<LauncherBuildTask> indexes = new ArrayList<>();
tasks.stream().filter(pred).forEach(indexes::add);
indexes.forEach(e -> tasks.set(tasks.indexOf(e) + count, taskRep));
}
public void addPre(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(-1, pred, taskAdd);
}
public void add(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(0, pred, taskAdd);
}
public void addAfter(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(1, pred, taskAdd);
}
public void replacePre(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(-1, pred, taskRep);
}
public void replace(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(0, pred, taskRep);
}
public void replaceAfter(Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(1, pred, taskRep);
}
public <T extends LauncherBuildTask> List<T> getTasksByClass(Class<T> taskClass) {
return tasks.stream().filter(taskClass::isInstance).map(taskClass::cast).collect(Collectors.toList());
}
public <T extends LauncherBuildTask> Optional<T> getTaskByClass(Class<T> taskClass) {
return tasks.stream().filter(taskClass::isInstance).map(taskClass::cast).findFirst();
}
public Optional<LauncherBuildTask> getTaskBefore(Predicate<LauncherBuildTask> pred) {
LauncherBuildTask last = null;
for(var e : tasks) {
if(pred.test(e)) {
return Optional.ofNullable(last);
}
last = e;
}
return Optional.empty();
}
public String nextName(String taskName) {
return nameFormat.formatted(taskName);
}
public Path nextPath(String taskName) {
return buildDir.resolve(nextName(taskName));
}
public Path nextPath(LauncherBuildTask task) {
return nextPath(task.getName());
}
public Path nextLowerPath(LauncherBuildTask task) {
return nextPath(CommonHelper.low(task.getName()));
}
}

View file

@ -0,0 +1,281 @@
package pro.gravit.launchserver.binary;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launcher.core.serialize.HOutput;
import pro.gravit.launcher.core.serialize.stream.StreamObject;
import pro.gravit.launchserver.binary.tasks.MainBuildTask;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.SecurityHelper;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import static pro.gravit.utils.helper.IOHelper.newZipEntry;
public class BuildContext {
public final ZipOutputStream output;
public final List<JarFile> readerClassPath;
public final MainBuildTask task;
public final HashSet<String> fileList;
public final HashSet<String> clientModules;
public final HashSet<String> legacyClientModules;
private Path runtimeDir;
private boolean deleteRuntimeDir;
public BuildContext(ZipOutputStream output, List<JarFile> readerClassPath, MainBuildTask task, Path runtimeDir) {
this.output = output;
this.readerClassPath = readerClassPath;
this.task = task;
this.runtimeDir = runtimeDir;
fileList = new HashSet<>(1024);
clientModules = new HashSet<>();
legacyClientModules = new HashSet<>();
}
public void pushFile(String filename, InputStream inputStream) throws IOException {
ZipEntry zip = IOHelper.newZipEntry(filename);
output.putNextEntry(zip);
IOHelper.transfer(inputStream, output);
output.closeEntry();
fileList.add(filename);
}
public void pushFile(String filename, StreamObject object) throws IOException {
ZipEntry zip = IOHelper.newZipEntry(filename);
output.putNextEntry(zip);
object.write(new HOutput(output));
output.closeEntry();
fileList.add(filename);
}
public void pushFile(String filename, Object object, Type type) throws IOException {
ZipEntry zip = IOHelper.newZipEntry(filename);
output.putNextEntry(zip);
try (BufferedWriter w = IOHelper.newWriter(IOHelper.nonClosing(output))) {
Launcher.gsonManager.gson.toJson(object, type);
}
output.closeEntry();
fileList.add(filename);
pushBytes(filename, IOHelper.encode(Launcher.gsonManager.gson.toJson(object, type)));
}
public void pushDir(Path dir, String targetDir, Map<String, byte[]> hashMap, boolean hidden) throws IOException {
IOHelper.walk(dir, new RuntimeDirVisitor(output, hashMap, dir, targetDir), hidden);
}
public void pushEncryptedDir(Path dir, String targetDir, String aesHexKey, Map<String, byte[]> hashMap, boolean hidden) throws IOException {
IOHelper.walk(dir, new EncryptedRuntimeDirVisitor(output, aesHexKey, hashMap, dir, targetDir), hidden);
}
public void pushBytes(String filename, byte[] bytes) throws IOException {
ZipEntry zip = IOHelper.newZipEntry(filename);
output.putNextEntry(zip);
output.write(bytes);
output.closeEntry();
fileList.add(filename);
}
public void pushJarFile(Path jarfile, Predicate<ZipEntry> filter, Predicate<String> needTransform) throws IOException {
pushJarFile(jarfile.toUri().toURL(), filter, needTransform);
}
public Path getRuntimeDir() {
return runtimeDir;
}
public void setRuntimeDir(Path runtimeDir) {
this.runtimeDir = runtimeDir;
}
public void pushJarFile(URL jarfile, Predicate<ZipEntry> filter, Predicate<String> needTransform) throws IOException {
try (ZipInputStream input = new ZipInputStream(IOHelper.newInput(jarfile))) {
ZipEntry e = input.getNextEntry();
while (e != null) {
String filename = e.getName();
if (e.isDirectory() || fileList.contains(filename) || filter.test(e)) {
e = input.getNextEntry();
continue;
}
output.putNextEntry(IOHelper.newZipEntry(e));
if (filename.endsWith(".class")) {
String classname = filename.replace('/', '.').substring(0,
filename.length() - ".class".length());
if (!needTransform.test(classname)) {
IOHelper.transfer(input, output);
} else {
byte[] bytes = IOHelper.read(input);
bytes = task.transformClass(bytes, classname, this);
output.write(bytes);
}
} else
IOHelper.transfer(input, output);
fileList.add(filename);
e = input.getNextEntry();
}
}
}
public boolean isDeleteRuntimeDir() {
return deleteRuntimeDir;
}
public void setDeleteRuntimeDir(boolean deleteRuntimeDir) {
this.deleteRuntimeDir = deleteRuntimeDir;
}
private final static class RuntimeDirVisitor extends SimpleFileVisitor<Path> {
private final ZipOutputStream output;
private final Map<String, byte[]> hashs;
private final Path sourceDir;
private final String targetDir;
private RuntimeDirVisitor(ZipOutputStream output, Map<String, byte[]> hashs, Path sourceDir, String targetDir) {
this.output = output;
this.hashs = hashs;
this.sourceDir = sourceDir;
this.targetDir = targetDir;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
String dirName = IOHelper.toString(sourceDir.relativize(dir));
output.putNextEntry(newEntry(dirName + '/'));
return super.preVisitDirectory(dir, attrs);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String fileName = IOHelper.toString(sourceDir.relativize(file));
if (hashs != null)
hashs.put(fileName, SecurityHelper.digest(SecurityHelper.DigestAlgorithm.MD5, file));
// Create zip entry and transfer contents
output.putNextEntry(newEntry(fileName));
IOHelper.transfer(file, output);
// Return result
return super.visitFile(file, attrs);
}
private ZipEntry newEntry(String fileName) {
return newZipEntry(targetDir + IOHelper.CROSS_SEPARATOR + fileName);
}
}
private final static class EncryptedRuntimeDirVisitor extends SimpleFileVisitor<Path> {
private final ZipOutputStream output;
private final Map<String, byte[]> hashs;
private final Path sourceDir;
private final String targetDir;
private final SecretKeySpec sKeySpec;
private final IvParameterSpec iKeySpec;
private final transient Logger logger = LogManager.getLogger();
private EncryptedRuntimeDirVisitor(ZipOutputStream output, String aesKey, Map<String, byte[]> hashs, Path sourceDir, String targetDir) {
this.output = output;
this.hashs = hashs;
this.sourceDir = sourceDir;
this.targetDir = targetDir;
try {
byte[] key = SecurityHelper.fromHex(aesKey);
byte[] compatKey = SecurityHelper.getAESKey(key);
sKeySpec = new SecretKeySpec(compatKey, "AES/CBC/PKCS5Padding");
iKeySpec = new IvParameterSpec(IOHelper.encode("8u3d90ikr7o67lsq"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
byte[] digest = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.MD5, file);
String fileName = IOHelper.toString(sourceDir.relativize(file));
if (hashs != null) {
hashs.put(fileName, digest);
}
// Create zip entry and transfer contents
try {
output.putNextEntry(newEntry(SecurityHelper.toHex(digest)));
} catch (ZipException e) {
return super.visitFile(file, attrs); // fix duplicate files
}
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, iKeySpec);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
}
try (OutputStream stream = new CipherOutputStream(new NoCloseOutputStream(output), cipher)) {
IOHelper.transfer(file, stream);
}
// Return result
return super.visitFile(file, attrs);
}
private ZipEntry newEntry(String fileName) {
return newZipEntry(targetDir + IOHelper.CROSS_SEPARATOR + fileName);
}
private static class NoCloseOutputStream extends OutputStream {
private final OutputStream stream;
private NoCloseOutputStream(OutputStream stream) {
this.stream = stream;
}
@Override
public void write(int i) throws IOException {
stream.write(i);
}
@Override
public void write(byte[] b) throws IOException {
stream.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
stream.write(b, off, len);
}
@Override
public void flush() throws IOException {
stream.flush();
}
}
}
}

View file

@ -0,0 +1,22 @@
package pro.gravit.launchserver.binary;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException;
import java.nio.file.Files;
public class EXELauncherBinary extends LauncherBinary {
public EXELauncherBinary(LaunchServer server) {
super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s.exe");
}
@Override
public void build() throws IOException {
if (IOHelper.isFile(syncBinaryFile)) {
Files.delete(syncBinaryFile);
}
}
}

View file

@ -0,0 +1,49 @@
package pro.gravit.launchserver.binary;
import pro.gravit.launcher.base.Launcher;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.binary.tasks.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
public final class JARLauncherBinary extends LauncherBinary {
public final AtomicLong count;
public final Path runtimeDir;
public final Path buildDir;
public final List<Path> coreLibs;
public final List<Path> addonLibs;
public final Map<String, Path> files;
public JARLauncherBinary(LaunchServer server) throws IOException {
super(server, resolve(server, ".jar"), "Launcher-%s.jar");
count = new AtomicLong(0);
runtimeDir = server.dir.resolve(Launcher.RUNTIME_DIR);
buildDir = server.dir.resolve("build");
coreLibs = new ArrayList<>();
addonLibs = new ArrayList<>();
files = new HashMap<>();
if (!Files.isDirectory(buildDir)) {
Files.deleteIfExists(buildDir);
Files.createDirectory(buildDir);
}
}
@Override
public void init() {
tasks.add(new PrepareBuildTask(server));
if (!server.config.sign.enabled) tasks.add(new CertificateAutogenTask(server));
tasks.add(new MainBuildTask(server));
tasks.add(new AttachJarsTask(server));
tasks.add(new AdditionalFixesApplyTask(server));
if (server.config.launcher.compress) tasks.add(new CompressBuildTask(server));
tasks.add(new SignJarTask(server.config.sign, server));
}
}

View file

@ -0,0 +1,69 @@
package pro.gravit.launchserver.binary;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.binary.tasks.LauncherBuildTask;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
public abstract class LauncherBinary extends BinaryPipeline {
public final LaunchServer server;
public final Path syncBinaryFile;
private volatile byte[] digest;
protected LauncherBinary(LaunchServer server, Path binaryFile, String nameFormat) {
super(server.tmpDir.resolve("build"), nameFormat);
this.server = server;
syncBinaryFile = binaryFile;
}
public static Path resolve(LaunchServer server, String ext) {
return Path.of(server.config.binaryName + ext);
}
public void build() throws IOException {
logger.info("Building launcher binary file");
Path thisPath = null;
long time_start = System.currentTimeMillis();
long time_this = time_start;
for (LauncherBuildTask task : tasks) {
logger.info("Task {}", task.getName());
Path oldPath = thisPath;
thisPath = task.process(oldPath);
long time_task_end = System.currentTimeMillis();
long time_task = time_task_end - time_this;
time_this = time_task_end;
logger.info("Task {} processed from {} millis", task.getName(), time_task);
}
long time_end = System.currentTimeMillis();
server.config.updatesProvider.upload(null, Map.of(syncBinaryFile.toString(), thisPath), true);
IOHelper.deleteDir(buildDir, false);
logger.info("Build successful from {} millis", time_end - time_start);
}
public final boolean exists() {
return syncBinaryFile != null && IOHelper.isFile(syncBinaryFile);
}
public final byte[] getDigest() {
return digest;
}
public void init() {
}
public final boolean sync() {
try {
var target = syncBinaryFile.toString();
var path = server.config.updatesProvider.download(null, List.of(target)).get(target);
digest = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA512, IOHelper.read(path));
return true;
} catch (Throwable e) {
return false;
}
}
}

View file

@ -1,45 +1,25 @@
package ru.gravit.launchserver.binary;
package pro.gravit.launchserver.binary;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.cms.CMSTypedData;
import org.bouncycastle.cms.SignerInfoGenerator;
import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
import org.bouncycastle.util.Store;
import pro.gravit.launchserver.helper.SignHelper;
import pro.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.IOHelper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Supplier;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
@ -59,104 +39,28 @@
* </pre>
*/
public class SignerJar implements AutoCloseable {
/**
* Helper output stream that also sends the data to the given {@link com.google.common.hash.Hasher}.
*/
private static class HashingOutputStream extends OutputStream {
private final OutputStream out;
private final MessageDigest hasher;
public HashingOutputStream(OutputStream out, MessageDigest hasher) {
this.out = out;
this.hasher = hasher;
}
@Override
public void close() throws IOException {
out.close();
}
@Override
public void flush() throws IOException {
out.flush();
}
@Override
public void write(byte[] b) throws IOException {
out.write(b);
hasher.update(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
hasher.update(b, off, len);
}
@Override
public void write(int b) throws IOException {
out.write(b);
hasher.update((byte) b);
}
}
private static final String MANIFEST_FN = "META-INF/MANIFEST.MF";
private static final String SIG_FN = "META-INF/SIGNUMO.SF";
private static final String SIG_RSA_FN = "META-INF/SIGNUMO.RSA";
private static final String hashFunctionName = "SHA-256";
public static KeyStore getStore(Path file, String storepass, String algo) throws IOException {
try {
KeyStore st = KeyStore.getInstance(algo);
st.load(IOHelper.newInput(file), storepass != null ? storepass.toCharArray() : null);
return st;
} catch (NoSuchAlgorithmException | CertificateException | KeyStoreException e) {
throw new IOException(e);
}
}
private static MessageDigest hasher() {
try {
return MessageDigest.getInstance(hashFunctionName);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
private static final String DIGEST_HASH = SignHelper.hashFunctionName + "-Digest";
private final String SIG_FN;
private final String SIG_KEY_FN;
private final ZipOutputStream zos;
private final KeyStore keyStore;
private final String keyAlias;
private final String password;
private final Map<String, String> manifestAttributes;
private final Map<String, String> fileDigests;
private final Map<String, String> sectionDigests;
private final Supplier<CMSSignedDataGenerator> gen;
private String manifestHash;
private String manifestMainHash;
private final Map<String, String> fileDigests;
private final Map<String, String> sectionDigests;
/**
* Constructor.
*
* @param out the output stream to write JAR data to
* @param keyStore the key store to load given key from
* @param keyAlias the name of the key in the store, this key is used to sign the JAR
* @param keyPassword the password to access the key
*/
public SignerJar(OutputStream out, KeyStore keyStore, String keyAlias, String keyPassword) {
zos = new ZipOutputStream(out);
this.keyStore = keyStore;
this.keyAlias = keyAlias;
password = keyPassword;
public SignerJar(ZipOutputStream out, Supplier<CMSSignedDataGenerator> gen, String sig_fn, String sig_key_fn) {
zos = out;
this.gen = gen;
manifestAttributes = new LinkedHashMap<>();
fileDigests = new LinkedHashMap<>();
sectionDigests = new LinkedHashMap<>();
SIG_FN = "META-INF/".concat(sig_fn);
SIG_KEY_FN = "META-INF/".concat(sig_key_fn);
}
/**
@ -165,16 +69,10 @@ public SignerJar(OutputStream out, KeyStore keyStore, String keyAlias, String ke
*
* @param filename name of the file to add (use forward slash as a path separator)
* @param contents contents of the file
* @throws java.io.IOException
* @throws NullPointerException if any of the arguments is {@code null}
*/
public void addFileContents(String filename, byte[] contents) throws IOException {
zos.putNextEntry(new ZipEntry(filename));
zos.write(contents);
zos.closeEntry();
String hashCode64 = Base64.getEncoder().encodeToString(hasher().digest(contents));
fileDigests.put(filename, hashCode64);
addFileContents(filename, new ByteArrayInputStream(contents));
}
/**
@ -183,17 +81,10 @@ public void addFileContents(String filename, byte[] contents) throws IOException
*
* @param filename name of the file to add (use forward slash as a path separator)
* @param contents contents of the file
* @throws java.io.IOException
* @throws NullPointerException if any of the arguments is {@code null}
*/
public void addFileContents(String filename, InputStream contents) throws IOException {
zos.putNextEntry(new ZipEntry(filename));
byte[] arr = IOHelper.toByteArray(contents);
zos.write(arr);
zos.closeEntry();
String hashCode64 = Base64.getEncoder().encodeToString(hasher().digest(arr));
fileDigests.put(filename, hashCode64);
addFileContents(IOHelper.newZipEntry(filename), contents);
}
/**
@ -202,16 +93,10 @@ public void addFileContents(String filename, InputStream contents) throws IOExce
*
* @param entry name of the file to add (use forward slash as a path separator)
* @param contents contents of the file
* @throws java.io.IOException
* @throws NullPointerException if any of the arguments is {@code null}
*/
public void addFileContents(ZipEntry entry, byte[] contents) throws IOException {
zos.putNextEntry(entry);
zos.write(contents);
zos.closeEntry();
String hashCode64 = Base64.getEncoder().encodeToString(hasher().digest(contents));
fileDigests.put(entry.getName(), hashCode64);
addFileContents(entry, new ByteArrayInputStream(contents));
}
/**
@ -220,24 +105,20 @@ public void addFileContents(ZipEntry entry, byte[] contents) throws IOException
*
* @param entry name of the file to add (use forward slash as a path separator)
* @param contents contents of the file
* @throws java.io.IOException
* @throws NullPointerException if any of the arguments is {@code null}
*/
public void addFileContents(ZipEntry entry, InputStream contents) throws IOException {
zos.putNextEntry(entry);
byte[] arr = IOHelper.toByteArray(contents);
zos.write(arr);
SignHelper.HashingOutputStream out = new SignHelper.HashingNonClosingOutputStream(zos, SignHelper.hasher());
IOHelper.transfer(contents, out);
zos.closeEntry();
String hashCode64 = Base64.getEncoder().encodeToString(hasher().digest(arr));
fileDigests.put(entry.getName(), hashCode64);
fileDigests.put(entry.getName(), Base64.getEncoder().encodeToString(out.digest()));
}
/**
* Adds a header to the manifest of the JAR.
*
* @param name name of the attribute, it is placed into the main section of the manifest file, it cannot be longer
* than {@value #MANIFEST_ATTR_MAX_LEN} bytes (in utf-8 encoding)
* @param name name of the attribute, it is placed into the main section of the manifest file
* @param value value of the attribute
*/
public void addManifestAttribute(String name, String value) {
@ -249,7 +130,6 @@ public void addManifestAttribute(String name, String value) {
* Closes the JAR file by writing the manifest and signature data to it and finishing the ZIP entries. It closes the
* underlying stream.
*
* @throws java.io.IOException
* @throws RuntimeException if the signing goes wrong
*/
@Override
@ -258,36 +138,16 @@ public void close() throws IOException {
zos.close();
}
/**
* Creates the beast that can actually sign the data.
*/
private CMSSignedDataGenerator createSignedDataGenerator() throws Exception {
Security.addProvider(new BouncyCastleProvider());
List<Certificate> certChain = new ArrayList<>(Arrays.asList(keyStore.getCertificateChain(keyAlias)));
Store certStore = new JcaCertStore(certChain);
Certificate cert = keyStore.getCertificate(keyAlias);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, password != null ? password.toCharArray() : null);
ContentSigner signer = new JcaContentSignerBuilder("SHA256WITHRSA").setProvider("BC").build(privateKey);
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
DigestCalculatorProvider dcp = new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
SignerInfoGenerator sig = new JcaSignerInfoGeneratorBuilder(dcp).build(signer, (X509Certificate) cert);
generator.addSignerInfoGenerator(sig);
generator.addCertificates(certStore);
return generator;
}
/**
* Finishes the JAR file by writing the manifest and signature data to it and finishing the ZIP entries. It leaves the
* underlying stream open.
*
* @throws java.io.IOException
* @throws RuntimeException if the signing goes wrong
*/
public void finish() throws IOException {
writeManifest();
byte sig[] = writeSigFile();
byte[] sig = writeSigFile();
writeSignature(sig);
zos.finish();
}
@ -311,7 +171,7 @@ private String hashEntrySection(String name, Attributes attributes) throws IOExc
manifest.write(o);
byte[] ob = o.toByteArray();
ob = Arrays.copyOfRange(ob, emptyLen, ob.length);
return Base64.getEncoder().encodeToString(hasher().digest(ob));
return Base64.getEncoder().encodeToString(SignHelper.hasher().digest(ob));
}
/**
@ -320,39 +180,18 @@ private String hashEntrySection(String name, Attributes attributes) throws IOExc
private String hashMainSection(Attributes attributes) throws IOException {
Manifest manifest = new Manifest();
manifest.getMainAttributes().putAll(attributes);
MessageDigest hasher = hasher();
SignerJar.HashingOutputStream o = new SignerJar.HashingOutputStream(new OutputStream() {
@Override
public String toString() {
return "NullOutputStream";
}
/** Discards the specified byte array. */
@Override
public void write(byte[] b) {
}
/** Discards the specified byte array. */
@Override
public void write(byte[] b, int off, int len) {
}
/** Discards the specified byte. */
@Override
public void write(int b) {
}
}, hasher);
SignHelper.HashingOutputStream o = new SignHelper.HashingNonClosingOutputStream(SignHelper.NULL, SignHelper.hasher());
manifest.write(o);
return Base64.getEncoder().encodeToString(hasher.digest());
return Base64.getEncoder().encodeToString(o.digest());
}
/**
* Returns the CMS signed data.
*/
private byte[] signSigFile(byte[] sigContents) throws Exception {
CMSSignedDataGenerator gen = createSignedDataGenerator();
CMSSignedDataGenerator gen = this.gen.get();
CMSTypedData cmsData = new CMSProcessableByteArray(sigContents);
CMSSignedData signedData = gen.generate(cmsData, true);
CMSSignedData signedData = gen.generate(cmsData, false);
return signedData.getEncoded();
}
@ -360,10 +199,9 @@ private byte[] signSigFile(byte[] sigContents) throws Exception {
* Writes the manifest to the JAR. It also calculates the digests that are required to be placed in the the signature
* file.
*
* @throws java.io.IOException
*/
private void writeManifest() throws IOException {
zos.putNextEntry(new ZipEntry(MANIFEST_FN));
zos.putNextEntry(IOHelper.newZipEntry(MANIFEST_FN));
Manifest man = new Manifest();
// main section
@ -374,7 +212,7 @@ private void writeManifest() throws IOException {
mainAttributes.put(new Attributes.Name(entry.getKey()), entry.getValue());
// individual files sections
Attributes.Name digestAttr = new Attributes.Name(hashFunctionName + "-Digest");
Attributes.Name digestAttr = new Attributes.Name(DIGEST_HASH);
for (Map.Entry<String, String> entry : fileDigests.entrySet()) {
Attributes attributes = new Attributes();
man.getEntries().put(entry.getKey(), attributes);
@ -382,12 +220,11 @@ private void writeManifest() throws IOException {
sectionDigests.put(entry.getKey(), hashEntrySection(entry.getKey(), attributes));
}
MessageDigest hasher = hasher();
OutputStream out = new SignerJar.HashingOutputStream(zos, hasher);
SignHelper.HashingOutputStream out = new SignHelper.HashingNonClosingOutputStream(zos, SignHelper.hasher());
man.write(out);
zos.closeEntry();
manifestHash = Base64.getEncoder().encodeToString(hasher.digest());
manifestHash = Base64.getEncoder().encodeToString(out.digest());
manifestMainHash = hashMainSection(man.getMainAttributes());
}
@ -397,16 +234,16 @@ private void writeManifest() throws IOException {
* @return the contents of the file as bytes
*/
private byte[] writeSigFile() throws IOException {
zos.putNextEntry(new ZipEntry(SIG_FN));
zos.putNextEntry(IOHelper.newZipEntry(SIG_FN));
Manifest man = new Manifest();
// main section
Attributes mainAttributes = man.getMainAttributes();
mainAttributes.put(Attributes.Name.SIGNATURE_VERSION, "1.0");
mainAttributes.put(new Attributes.Name(hashFunctionName + "-Digest-Manifest"), manifestHash);
mainAttributes.put(new Attributes.Name(hashFunctionName + "-Digest-Manifest-Main-Attributes"), manifestMainHash);
mainAttributes.put(new Attributes.Name(DIGEST_HASH + "-Manifest"), manifestHash);
mainAttributes.put(new Attributes.Name(DIGEST_HASH + "-Manifest-Main-Attributes"), manifestMainHash);
// individual files sections
Attributes.Name digestAttr = new Attributes.Name(hashFunctionName + "-Digest");
Attributes.Name digestAttr = new Attributes.Name(DIGEST_HASH);
for (Map.Entry<String, String> entry : sectionDigests.entrySet()) {
Attributes attributes = new Attributes();
man.getEntries().put(entry.getKey(), attributes);
@ -424,11 +261,10 @@ private byte[] writeSigFile() throws IOException {
/**
* Signs the .SIG file and writes the signature (.RSA file) to the JAR.
*
* @throws java.io.IOException
* @throws RuntimeException if the signing failed
*/
private void writeSignature(byte[] sigFile) throws IOException {
zos.putNextEntry(new ZipEntry(SIG_RSA_FN));
zos.putNextEntry(IOHelper.newZipEntry(SIG_KEY_FN));
try {
byte[] signature = signSigFile(sigFile);
zos.write(signature);

View file

@ -0,0 +1,77 @@
package pro.gravit.launchserver.binary.tasks;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.asm.ClassMetadataReader;
import pro.gravit.launchserver.asm.SafeClassWriter;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.function.Predicate;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class AdditionalFixesApplyTask implements LauncherBuildTask {
private final LaunchServer server;
public AdditionalFixesApplyTask(LaunchServer server) {
this.server = server;
}
public static void apply(Path inputFile, Path addFile, ZipOutputStream output, LaunchServer srv, Predicate<ZipEntry> excluder, boolean needFixes) throws IOException {
try (ClassMetadataReader reader = new ClassMetadataReader()) {
reader.getCp().add(new JarFile(inputFile.toFile()));
try (ZipInputStream input = IOHelper.newZipInput(addFile)) {
ZipEntry e = input.getNextEntry();
while (e != null) {
if (e.isDirectory() || excluder.test(e)) {
e = input.getNextEntry();
continue;
}
String filename = e.getName();
output.putNextEntry(IOHelper.newZipEntry(e));
if (filename.endsWith(".class")) {
byte[] bytes;
if (needFixes) {
bytes = classFix(input, reader, srv.config.launcher.stripLineNumbers);
output.write(bytes);
} else
IOHelper.transfer(input, output);
} else
IOHelper.transfer(input, output);
e = input.getNextEntry();
}
}
}
}
private static byte[] classFix(InputStream input, ClassMetadataReader reader, boolean stripNumbers) throws IOException {
ClassReader cr = new ClassReader(input);
ClassNode cn = new ClassNode();
cr.accept(cn, stripNumbers ? (ClassReader.SKIP_DEBUG) : 0);
ClassWriter cw = new SafeClassWriter(reader, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
cn.accept(cw);
return cw.toByteArray();
}
@Override
public String getName() {
return "AdditionalFixesApply";
}
@Override
public Path process(Path inputFile) throws IOException {
Path out = server.launcherBinary.nextPath("post-fixed");
try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(out))) {
apply(inputFile, inputFile, output, server, (e) -> false, true);
}
return out;
}
}

View file

@ -0,0 +1,78 @@
package pro.gravit.launchserver.binary.tasks;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class AttachJarsTask implements LauncherBuildTask {
private final LaunchServer srv;
private final List<Path> jars;
private final List<String> exclusions;
public AttachJarsTask(LaunchServer srv) {
this.srv = srv;
jars = new ArrayList<>();
exclusions = new ArrayList<>();
exclusions.add("META-INF");
exclusions.add("module-info.class");
exclusions.add("LICENSE");
exclusions.add("LICENSE.txt");
}
@Override
public String getName() {
return "AttachJars";
}
@Override
public Path process(Path inputFile) throws IOException {
Path outputFile = srv.launcherBinary.nextPath("attached");
try (ZipInputStream input = IOHelper.newZipInput(inputFile);
ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(outputFile))) {
ZipEntry e = input.getNextEntry();
while (e != null) {
if (e.isDirectory()) {
e = input.getNextEntry();
continue;
}
output.putNextEntry(IOHelper.newZipEntry(e));
IOHelper.transfer(input, output);
e = input.getNextEntry();
}
attach(output, inputFile, srv.launcherBinary.coreLibs);
attach(output, inputFile, jars);
for(var entry : srv.launcherBinary.files.entrySet()) {
ZipEntry newEntry = IOHelper.newZipEntry(entry.getKey());
output.putNextEntry(newEntry);
IOHelper.transfer(entry.getValue(), output);
}
}
return outputFile;
}
private void attach(ZipOutputStream output, Path inputFile, List<Path> lst) throws IOException {
for (Path p : lst) {
AdditionalFixesApplyTask.apply(inputFile, p, output, srv, (e) -> filter(e.getName()), false);
}
}
private boolean filter(String name) {
if (name.startsWith("META-INF/services")) return false;
return exclusions.stream().anyMatch(name::startsWith);
}
public List<Path> getJars() {
return jars;
}
public List<String> getExclusions() {
return exclusions;
}
}

View file

@ -0,0 +1,84 @@
package pro.gravit.launchserver.binary.tasks;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.X500NameBuilder;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.KeyPurposeId;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.helper.SignHelper;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Path;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
public class CertificateAutogenTask implements LauncherBuildTask {
private final LaunchServer server;
private transient final Logger logger = LogManager.getLogger();
public X509Certificate certificate;
public X509CertificateHolder bcCertificate;
public CMSSignedDataGenerator signedDataGenerator;
public CertificateAutogenTask(LaunchServer server) {
this.server = server;
}
@Override
public String getName() {
return "CertificateAutogen";
}
@Override
public Path process(Path inputFile) throws IOException {
if (signedDataGenerator != null) return inputFile;
try {
logger.warn("You are using an auto-generated certificate (sign.enabled false). It is not good");
logger.warn("It is highly recommended that you use the correct certificate (sign.enabled true)");
logger.warn("You can use GenerateCertificateModule or your own certificate.");
X500NameBuilder subject = new X500NameBuilder();
subject.addRDN(BCStyle.CN, server.config.projectName.concat(" Autogenerated"));
subject.addRDN(BCStyle.O, server.config.projectName);
LocalDateTime startDate = LocalDate.now().atStartOfDay();
X509v3CertificateBuilder builder = new X509v3CertificateBuilder(
subject.build(),
new BigInteger("0"),
Date.from(startDate.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(startDate.plusDays(3650).atZone(ZoneId.systemDefault()).toInstant()),
new X500Name("CN=ca"),
SubjectPublicKeyInfo.getInstance(server.keyAgreementManager.ecdsaPublicKey.getEncoded()));
builder.addExtension(Extension.extendedKeyUsage, false, new ExtendedKeyUsage(KeyPurposeId.id_kp_codeSigning));
//builder.addExtension(Extension.keyUsage, false, new KeyUsage(1));
JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SHA256WITHECDSA");
ContentSigner signer = csBuilder.build(server.keyAgreementManager.ecdsaPrivateKey);
bcCertificate = builder.build(signer);
certificate = new JcaX509CertificateConverter().setProvider("BC")
.getCertificate(bcCertificate);
ArrayList<Certificate> chain = new ArrayList<>();
chain.add(certificate);
signedDataGenerator = SignHelper.createSignedDataGenerator(server.keyAgreementManager.ecdsaPrivateKey, certificate, chain, "SHA256WITHECDSA");
} catch (OperatorCreationException | CMSException | CertificateException e) {
logger.error("Certificate generate failed", e);
}
return inputFile;
}
}

View file

@ -0,0 +1,46 @@
package pro.gravit.launchserver.binary.tasks;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException;
import java.nio.file.Path;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class CompressBuildTask implements LauncherBuildTask {
public transient final LaunchServer server;
public CompressBuildTask(LaunchServer server) {
this.server = server;
}
@Override
public String getName() {
return "compress";
}
@Override
public Path process(Path inputFile) throws IOException {
Path output = server.launcherBinary.nextPath(this);
try (ZipOutputStream outputStream = new ZipOutputStream(IOHelper.newOutput(output))) {
outputStream.setMethod(ZipOutputStream.DEFLATED);
outputStream.setLevel(Deflater.BEST_COMPRESSION);
try (ZipInputStream input = IOHelper.newZipInput(inputFile)) {
ZipEntry e = input.getNextEntry();
while (e != null) {
if (e.isDirectory()) {
e = input.getNextEntry();
continue;
}
outputStream.putNextEntry(IOHelper.newZipEntry(e));
IOHelper.transfer(input, outputStream);
e = input.getNextEntry();
}
}
}
return output;
}
}

Some files were not shown because too many files have changed in this diff Show more