优化架构

This commit is contained in:
huangxiaolei
2022-11-23 18:05:11 +08:00
parent 3efed3defe
commit 43403202b5
6760 changed files with 33748 additions and 554768 deletions

View File

@@ -0,0 +1,14 @@
http_port = 8080
[hk4e]
kcp_addr = "hk4e.flswld.com"
kcp_port = 22103
login_sdk_url = "https://api.flswld.com/api/v1/auth/login"
[logger]
level = "DEBUG"
method = "CONSOLE"
track_line = true
[database]
url = "mongodb://mongo:27017"

42
dispatch/cmd/main.go Normal file
View File

@@ -0,0 +1,42 @@
package main
import (
"hk4e/common/config"
"hk4e/dispatch/controller"
"hk4e/dispatch/dao"
"hk4e/logger"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
filePath := "./application.toml"
config.InitConfig(filePath)
logger.InitLogger("dispatch")
logger.LOG.Info("dispatch start")
db := dao.NewDao()
_ = controller.NewController(db)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
logger.LOG.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.LOG.Info("dispatch exit")
db.CloseDao()
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

1
dispatch/cmd/static/.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* binary

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDHPnAvEbJfMUwHXmRLiNDH1qFeGm0U/D6n7BjzEmJl5VtMKBZF
hnz+aKsyMo9aAowi2Fe/6iWUuzcbnAJS+4iLUxaeqOdvPe5LuR3wQxHKGJ8XsDkH
kt3T1operE1rpw9wX3xuUi0CA5aHqpC0ho0zMsk7nvxWQogv1G8uqcXmfQIDAQAB
AoGBALElFmEC/vAbyFkU119A+T9z2GzuWeW6j4qFI3mZ8tpdnVqMmaCe/irDrNIo
mcORWD7y0rHS4C7odQqbHoXhFXgXfrGJXcMu977uIxBKGj0UBz6YIciznk/8DrMo
o3q6+SGsNj5zvlU8oY6cpfC663VoQb7VWveUGN4zshdnvyiRAkEA8nlq/LEuQPCj
lp5wbUizJ3Uwll5N51N6Kzm1wRQ0vUtIzRK940lGMxlhihnJfifTColAnnzmWj/X
dWIULqIc0wJBANJbrnq1iim9Jue0UOhQn6hV8vvWHgLjK7zuEsUPDqzxfhmpmBEh
BwAaH3li6bGCbIfSJazs+LmNLB4YtMo6nW8CQAMtmjxjqiKJxOslen3ENSzwOUnP
RKAilPhaEkrMlABjKzoc48ZF4Jis3X1s5xozNW3u7JznMDHAondUaMVPtKcCQG45
9lp8aBJo+ErvlHm3TYHiz7kgwIcYzKFqStGRi0oaHM6LrJBFMyrdhWKQ7w3B3ubo
ui872TU5gUWgApP5VOcCQQDDvU76TpLQ2v2LO8D0L/Ds+t6HdGcPpKvlAm/YQYHL
X6Q435tFNbeWo3JzpGElb25zAQfXU5cvzYvg37f36iM6
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,5 @@
{"remoteName": "blocks/00/22551915.blk", "md5": "0cf3d6b599d443c7cfa4a3e6189a7757", "fileSize": 3184}
{"remoteName": "blocks/00/25060239.blk", "md5": "f3cf18d697e3380b2f833ccf2c7d4194", "fileSize": 3328}
{"remoteName": "blocks/00/29342328.blk", "md5": "3b8e2c23e33ce92f68e40196c574ae94", "fileSize": 14103}
{"remoteName": "blocks/00/32070509.blk", "md5": "4bf2a81d7565301269d1c90e14393045", "fileSize": 698}
{"remoteName": "blocks/00/33067900.blk", "md5": "0b4d781c1633537d2fa4b4f0f567d2ca", "fileSize": 454}

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1 @@
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

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAz/fyfozlDIDWG9e3Lb29+7j3c66wvUJBaBWP10rB9HTE6prj
fcGMqC9imr6zAdD9q+Gr1j7egvqgi3Da+VBAMFH92/5wD5PsD7dX8Z2f4o65Vk2n
VOY8Dl75Z/uRhg0Euwnfrved69z9LG6utmlyv6YUPAflXh/JFw7Dq6c4EGeR+Kej
FTwmVhEdzPGHjXhFmsVt9HdXRYSf4NxHPzOwj8tiSaOQA0jC4E4mM7rvGSH5GX6h
ma+7pJnl/5+rEVM0mSQvm0m1XefmuFy040bEZ/6O7ZenOGBsvvwuG3TT4FNDNzW8
Dw9ExH1l6NoRGaVkDdtrl/nFu5+a09Pm/E0ElwIDAQABAoIBAQCtH17Cck+KJQYX
j29xqG4qykNUDawbILiKCMkBE7553Wq/UcjmuuR4bVnML8ucS3mgR/BgHV3l8vUK
nxvqRx/oGZkWNazbiuwL+ThAblLWqrEmYuZVCoQcAnvkT8tIqDWz7fhDEuZnnkMz
ZcATIZzgZUSa5IfP3u3rP+MrVbyaCdzJEeI0Yrv1XT+M5ddkKQrYgqC5kRiYi/Lj
NcLJhqSVt8p37CdJx1PGHFjKKb4MZpANlNRgeTtWpGVfS0PJLzaiI1NyPSJv7xWZ
gVhbK9+wQxqSG6KmZ4vpEvRI1zKiov5BsAFN+GfuD5mpn1Xo9CpzTfj/sO13VpHH
+Mt80+yBAoGBAPYXVEcXug5zqkqXup4dp1S05saz1zWPhUhQm+CrbhgeTqpjngJJ
EB79qMrGmyki0P/cGtbTcrHf8+i7gDlIGW0OMb4/jn4f5ACVD00iyvkHSGPn0Aim
MoNOMbkGot7SkSnncwxXdawwDyTu2dofXuBr72+GYqgRAG52IuA0C0pRAoGBANhX
p/UyW/htB27frKch/rTKQKm12kBV20AkkRUQUibiiQyWueWKs+5bVaW5R5oDIhWx
qftJtnEFWUvWaTHpHsB/bpjS3CJ6WknqNbpa3QIScpV1uw8V+Etz/K2/ftjyZzFo
nqc+Jud5364xFdIlOsRj9gZnK83Wcui6EFxAer5nAoGBAJzTzzSjLUHqejqhKR98
nFeCFZPJpjuO5AxqunvaJAYgwlcZtueT8j8dvgTDvrvfYTu85CnFhNFQfFrzqspW
ZUW3hwHL9R3xatboJ2Er7Bf5iSuJ3my0pXpCSbO1Q/QmUrZWtl3GGsqJsg0CXjkA
RvFUN7ll9ddPRmwewykIYa2RAoGAcmKuWFNfE1O6WWIELH4p6LcDR3fyRI/gk+KB
nyx48zxVkAVllrsmdYFvIGd9Ny4u6F9+a3HG960HULS1/ACxFMCL3lumrsgYUvp1
m+mM7xqH4QRVeh14oZRa5hbY36YS76nMMMsI0Ny8aqJjUjADCXF81FfabkPTj79J
BS3GeEMCgYAXmFIT079QokHjJrWz/UaoEUbrNkXB/8vKiA4ZGSzMtl3jUPQdXrVf
e0ofeKiqCQs4f4S0dYEjCv7/OIijV5L24mj/Z1Q4q++S5OksKLPPAd3gX4AYbRcg
PS4rUKl1oDk/eYN0CNYC/DYV9sAv65lX8b35HYhvXISVYtwwQu/+Yg==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA02M1I1V/YvxANOvLFX8R7D8At40IlT7HDWpAW3t+tAgQ7sqj
CeYOxiXqOaaw2kJhM3HT5nZll48UmykVq45Q05J57nhdSsGXLJshtLcTg9liMEoW
61BjVZi9EPPRSnE05tBJc57iqZw+aEcaSU0awfzBc8IkRd6+pJ5iIgEVfuTluani
zhHWvRli3EkAF4VNhaTfP3EkYfr4NE899aUeScbbdLFI6u1XQudlJCPTxaISx5Zc
wM+nP3v242ABcjgUcfCbz0AY547WazK4bWP3qicyxo4MoLOoe9WBq6EuG4CuZQrz
Knq8ltSxud/6chdg8Mqp/IasEQ2TpvY78tEXDQIDAQABAoIBAQC4uPsYk4AsSe75
0Au6Dz7kSfIgdDhJ44AisvTmfLauMFZLtfxfjBDhCwTxuD7XnCZAxHm97Ty+AqSp
Km/raQQsvtWalMhBqYanzjDYMRv2niJ1vGjm3WrQxBaEF+yOtvrZsK5fQTslqInI
qknIQH7fgjazJ7Z28D18sYNj37qfFWSSymgFo+SoS/BKEr200lpRA/oaGXiHcyIO
jJidP6b7UGes7uhMXUvLrfozmCsSqslxXO5Uk5XN/fWl4LxCGX7mpNfPZIT5YBSj
HliFkNlxIjyJg8ORLGi82M2cuyxp39r93F6uaCjLtb+rdwlGur7npgXUkKfWQJf9
WE7uar6BAoGBAPXIuIuYFFUhqNz5CKU014jZu6Ql0z5ZA08V84cTJcfLIK4e2rqC
8DFTldA0FtVfOGt0V08H/x2pRChGOvUwGG5nn9Dqqh6BjByUrW4z2hnXzT3ZuSDh
6eapiCB1jl9meJ0snhF2Ps/hqWGL2b3SkCCe90qVTzOVOeLO6YUCIOq9AoGBANws
fQkAq/0xw8neRGNTrnXimvbS+VXPIF38widljubNN7DY5cIFTQJrnTBWKbuz/t9a
J8QX6TFL0ci/9vhPJoThfL12vL2kWGYgWkWRPmqaBW3yz7Hs5rt+xuH3/7A5w5vm
kEg1NZJgnsJ0rMUTu1Q6PM5CBg6OpyHY4ThBb8qRAoGAML8ciuMgtTm1yg3CPzHZ
xZSZeJbf7K+uzlKmOBX+GkAZPS91ZiRuCvpu7hpGpQ77m6Q5ZL1LRdC6adpz+wkM
72ix87d3AhHjfg+mzgKOsS1x0WCLLRBhWZQqIXXvRNCH/3RH7WKsVoKFG4mnJ9TJ
LQ8aMLqoOKzSDD/JZM3lRWkCgYA8hn5Y2zZshCGufMuQApETFxhCgfzI+geLztAQ
xHpkOEX296kxjQN+htbPUuBmGTUXcVE9NtWEF7Oz3BGocRnFrbb83odEGsmySXKH
bUYbR/v2Ham638UOBevmcqZ3a2m6kcdYEkiH1MfP7QMRqjr1DI1qpfvERLLtOxGu
xU5WAQKBgQCaVavyY6Slj3ZRQ7iKk9fHkge/bFl+zhANxRfWVOYMC8mD2gHDsq9C
IdCp1Mg0tJpWLaGgyDM1kgChZYsff4jRxHC4czvAtoPSlxWXF2nL31qJ3vk2Zzzc
a4GSHAInodXBrKstav5SIKosWKT2YysxgHlA9Sm2f4n09GjFbslEHg==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyaxqjPJP5+Innfv5IdfQqY/ftS++lnDRe3EczNkIjESWXhHS
OljEw9b9C+/BtF+fO9QZL7Z742y06eIdvsMPQKdGflB26+9OZ8AF4SpXDn3aVWGr
8+9qpB7BELRZI/Ph2FlFL4cobCzMHunncW8zTfMId48+fgHkAzCjRl5rC6XT0Yge
6+eKpXmF+hr0vGYWiTzqPzTABl44WZo3rw0yurZTzkrmRE4kR2VzkjY/rBnQAbFK
KFUKsUozjCXvSag4l461wDkhmmyivpNkK5cAxuDbsmC39iqagMt9438fajLVvYOv
pVs9ci5tiLcbBtfB4Rf/QVAkqtTm86Z0O3e7DwIDAQABAoIBAQCyma226vTW35LE
N5zXWuAg+hhcxk6bvofWMUMXKvGF/0vHPTMXlvuSkDeDNa4vBivneRthBNPMgb3q
DuTWxrogQMOOI8ZdhY3DFexfDvcQD2anDJuSqSmg9Nd36q+yxk3xIoXB5Ilo23dd
vTnJXHhsBNovv7zRLO134cAHFqDoKzt5EEHre0skUcn6HjHOek6c53jvpKr5LSrr
iwx5gMuY/7ZSIUDo9WGY70qbQFGY6bOlX9x8uNjcFF+7SztEVQ+vhJ/+7EvwqaJr
ysweo0l91TKM9WaMuwoucKeceVWuynEw6GGTw8UTLtltekLGe6bS8YxY8fVwnKkT
RwJYwAJRAoGBAP2rhcfOA+1Ja37hUHKebfp9rHsex4+pGyt3Kdu7WdqOn4sexmya
BuiHQcUchPDVla/ruQZ20+8LHgzBDo0m8sY7gpf715UV9NSVIRD0wu26SKRklOFz
J4HBOwU9hBGLSnRUJzyvVlt5O7E9hAv61SCrvWBEcow2YnKNQLwvjMVJAoGBAMuG
oSb3A/ulqtp2zpxVAclYe/bSItZZTOUWP6Vb4hOiHxIJ0n1H9ap6grOYkJ/Yn4gg
yYzKm/noF1wXP7Rj/xOahnvMkzhGdmOabvE9LH5HwQTWxBBWTkZzgBbYtbg+J5MT
cKqJaychSRjJj+xX+d90rtlSu/c27chlSRKAHXWXAoGAFTcIHDq9l1XBmL3tRXi8
h+uExlM/q2MgM5VmucrEbAPrke4D+Ec1drMBLCQDdkTWnPzg34qGlQJgA/8NYX61
ZSDK/j0AvaY1cKX8OvfNaaZftuf2j5ha4H4xmnGXnwQAORRkp62eUk4kUOFtLrdO
pcnXL7rpvZI6z4vCszpi0okCgYEAp3lZEl8g/+oK9UneKfYpSi1tlGTGFevVwozU
QpWhKta1CnraogycsnOtKWvZVi9C1xljwF7YioPY9QaMfTvroY3+K9DjM+OHd96U
fB4Chsc0pW60V10te/t+403f+oPqvLO6ehop+kEBjUwPCkQ6cQ3q8xmJYpvofoYZ
4wdZNnECgYBwG8Vrv7Z+kX9Zuh1FvcRoY57bYLU0cWW92SA3Nvi8pZOIEaLHrQyZ
pvvaLIicR1m9+KsOAmii7ru0zL7KsrGW+5migQsaDi4gzahKQpad/R7MLKi/L53r
Ymo0aZKARLHW82GbomQ0zxdRoo9vaqfGNpXkxyyt3k3GGDunmrskYw==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsJbFp3WcsiojjdQtVnTuvtawL2m4XxK93F6lCnFwcZqUP39t
xFGGlrogHMqreyawIUN7E5shtwGzigzjW8Ly5CryBJpXP3ehNTqJS7emb+9LlC19
Oxa1eQuUQnatgcsd16DPH7kJ5JzN3vXnhvUyk4Qficdmm0uk7FRaNYFi7EJs4xyq
FTrp3rDZ0dzBHumlIeK1om7FNt6Nyivgp+UybO7kl0NLFEeSlV4S+7ofitWQsO5x
YqKAzSzz+KIRQcxJidGBlZ1JN/g5DPDpx/ztvOWYUlM7TYk6xN3focZpU0kBzAw/
rn94yW9z8jpXfzk+MvWzVL/HAcPy4ySwkay0NwIDAQABAoIBADzKWpawbVYEHaM4
lLb7oCjAPXzE9zx7djLDvisfLCdfoINPedkoe52ty1o+BtRpWB7LXTY9pFic1FLE
5wvyy6zyf8hH3ZsysqNhWFxhh4FnLmx/UGokAir+anaK5mYVJ1vQtxzjlV1HAbQs
kRyrklKoHDdRFqiFXOwiib97oDNWhD+RxfyGwwJnynZZSXdLbLSiz/QHQNr/+Ufk
KRBaxt0CfU7mOLZxoy6fNAxHdBcBJPHCyh+aDvEbix7nSncSU8Ju/48YJ8DrglbZ
sXCYoA5Uz8NMDuaEMgoNWCFQVoEcRkEUoaH7BlWd3UUFRPnDZ1B4BmkrVoRE8a58
3OqSwakCgYEA19wQUISXtpnmCrEZfbyZ6IwOy8ZCVaVUtbTjVa8UyfNglzzJG3yz
cXU3X35v5/HNCHaXbG2qcbQLThnHBA+obW3RDo+Q49V84Zh1fUNH0ONHHuC09kB/
/gHqzn/4nLf1aJ2O0NrMyrZNsZ0ZKUKQuVCqWjBOmTNUitcc8RpXZ8sCgYEA0W09
POM/It7RoVGI+cfbbgSRmzFo9kzSp5lP7iZ81bnvUMabu2nv3OeGc3Pmdh1ZJFRw
6iDM6VVbG0uz8g+f8+JT32XdqM7MJAmgfcYfTVBMiVnh330WNkeRrGWqQzB2f2Wr
+0vJjU8CAAcOWDh0oNguJ1l1TSyKxqdL8FsA38UCgYEAudt1AJ7psgOYmqQZ+rUl
H6FYLAQsoWmVIk75XpE9KRUwmYdw8QXRy2LNpp9K4z7C9wKFJorWMsh+42Q2gzyo
HHBtjEf4zPLIb8XBg3UmpKjMV73Kkiy/B4nHDr4I5YdO+iCPEy0RH4kQJFnLjEcQ
LT9TLgxh4G7d4B2PgdjYYTkCgYEArdgiV2LETCvulBzcuYufqOn9/He9i4cl7p4j
bathQQFBmSnkqGQ+Cn/eagQxsKaYEsJNoOxtbNu/7x6eVzeFLawYt38Vy0UuzFN5
eC54WXNotTN5fk2VnKU4VYVnGrMmCobZhpbYzoZhQKiazby/g60wUtW9u7xXzqOd
M/428YkCgYBwbEOx1RboH8H+fP1CAiF+cqtq4Jrz9IRWPOgcDpt2Usk1rDweWrZx
bTRlwIaVc5csIEE2X02fut/TTXr1MoXHa6s2cQrnZYq44488NsO4TAC26hqs/x/H
bVOcX13gT26SYngAHHeh7xjWJr/KgIIwvcvgvoVs6lu7a8aLUvrOag==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxbbx2m1feHyrQ7jP+8mtDF/pyYLrJWKWAdEv3wZrOtjOZzeL
GPzsmkcgncgoRhX4dT+1itSMR9j9m0/OwsH2UoF6U32LxCOQWQD1AMgIZjAkJeJv
FTrtn8fMQ1701CkbaLTVIjRMlTw8kNXvNA/A9UatoiDmi4TFG6mrxTKZpIcTInvP
EpkK2A7Qsp1E4skFK8jmysy7uRhMaYHtPTsBvxP0zn3lhKB3W+HTqpneewXWHjCD
fL7Nbby91jbz5EKPZXWLuhXIvR1Cu4tiruorwXJxmXaP1HQZonytECNU/UOzP6GN
Ldq0eFDE4b04Wjp396551G99YiFP2nqHVJ5OMQIDAQABAoIBAQDEeYZhjyq+avUu
eSuFhOaIU4/ZhlXycsOqzpwJvzEz61tBSvrZPA5LSb9pzAvpic+7hDH94jX89+8d
NfO7qlADsVNEQJBxuv2o1MCjpCRkmBZz506IBGU60Kt1j5kwdCEergTW1q375z4w
l8f7LmSL2U6WvKcdojTVxohBkIUJ7shtmmukDi2YnMfe6T/2JuXDDL8rvIcnfr5E
MCgPQs+xLeLEGrIJdpUy1iIYZYrzvrpJwf9EJL3D0e7jkpbvAQZ8EF9YhEizJhOm
dzTqW4PgW2yUaHYd3q5QjiILy7AC+oOYoTZln3RfjPOxl+bYjeMOWlqkgtpPQkAE
4I64w8RZAoGBAPLR44pEkmTdfIIF8ZtzBiVfDZ29bT96J0CWXGVzp8x6bSu5J5jl
s7sP8DEcjGZ6vHsLGOvkcNxzcnR3l/5HOz6TIuvVuUm36b1jHltq1xZStjGeKZs1
ihhJSu2lIA+TrK8FCRnKARJ0ughXGNZFItgeM230Sgjp2RL4ISXJ724XAoGBANBy
S2RwNpUYvkCSZHSFnQM/jq1jldxw+0p4jAGpWLilEaA/8xWUnZrnCrPFF/t9llpb
dTR/dCI8ntIMAy2dH4IUHyYKUahyHSzCAUNKpS0s433kn5hy9tGvn7jyuOJ4dk9F
o1PIZM7qfzmkdCBbX3NF2TGpzOvbYGJHHC3ssVr3AoGBANHJDopN9iDYzpJTaktA
VEYDWnM2zmUyNylw/sDT7FwYRaup2xEZG2/5NC5qGM8NKTww+UYMZom/4FnJXXLd
vcyxOFGCpAORtoreUMLwioWJzkkN+apT1kxnPioVKJ7smhvYAOXcBZMZcAR2o0m0
D4eiiBJuJWyQBPCDmbfZQFffAoGBAKpcr4ewOrwS0/O8cgPV7CTqfjbyDFp1sLwF
2A/Hk66dotFBUvBRXZpruJCCxn4R/59r3lgAzy7oMrnjfXl7UHQk8+xIRMMSOQwK
p7OSv3szk96hy1pyo41vJ3CmWDsoTzGs7bcdMl72wvKemRaU92ckMEZpzAT8cEMC
cWKLb8yzAoGAMibG8IyHSo7CJz82+7UHm98jNOlg6s73CEjp0W/+FL45Ka7MF/lp
xtR3eSmxltvwvjQoti3V4Qboqtc2IPCt+EtapTM7Wo41wlLCWCNx4u25pZPH/c8g
1yQ+OvH+xOYG+SeO98Phw/8d3IRfR83aqisQHv5upo2Rozzo0Kh3OsE=
-----END RSA PRIVATE KEY-----

Binary file not shown.

View File

@@ -0,0 +1 @@
<EFBFBD><EFBFBD>lt1L <09><>ܟ<EFBFBD>.<15>\<5C>pXP<58><50>"ƀ(<28>a<><61><EFBFBD>

View File

@@ -0,0 +1 @@
OPrCJaJsJJJXI3$DQNduVQuB5s5jgf47mmABUJFZoKJUt5YcIt0wPCBcCCpuQ4dQz19rae5FeHYRpmb8WsjkIeEpAQi3uJlIgObMsL$Fmv1kPav7dDPBWKJuyFEOa2KpN1EGvWlJOqufR64SDYhIocM3HLT5VsLo$Bde3c2jsVPwygAGGcZU1rZCTaOo$2blfEMdpviC75gNDZzdGjAiOBahjs$!9fZKtNF2iI4UnGSE2aNXlIz9To8L9fSeA9mhJ2F0qTKa8UjxHiSurW0bSzloUUN83sT9UFBNz$c2IVIP!asMffifiTVmlb0MJ6jYUB!rMSR77SVmdNDlMRz1VnjR9xEENS1DnqUQSYq2JJAQJIZL6j4ABF!Dm5NisAf58vaRhY4Uz6zXEf$IZExmbToDsb49X6ATh7zZExCeddR8iDBFpdOAiveE0bO8pOgo!zYmt0$5sN8aJpDK10XbXkm21$Lvppj8gAV9SjUjT5j9luqok!PkTQS59zG1I$JSDzs1jkoaNTiO2LL0rJSHaTX2EMI4KUiMp1Tgpqsy$lSv89CVFg5AzODZX8TA5ne4lHT0aazfxQa354RHYRGe5OllgcuZVn88gWjmD3nUHtzhCpK0siGWqPvOlPX!OYUaJIFwaSy7v!K5Q2nX8qCjGAHeu1$hs0cdmn69r1pws0APbZ7BNm018poX7YxjiOBRV0tEKRcJbkKxad$t5dJIO9eJhKvk0l9xz8KjOF9u2NHhy5yQrHZWenJYDAIrmheIz2Q!vO7EePv2U6ACm5OJS8dDyWBMkFNuSoW4zv3RTIfdKw$!hd2bmSFQFic6jFNPeag53tpBPCiy3lNgIT0hgytmV9CBwZl!S$GzYOxv0buJ2P2Vvfah!bg4$nfAHKoHer4zTcYN4w3eSIBAOCKJW7uJ5Sk1uOcxVwBklzbN6l7m3Yhcyw44y76P7q$zeK4NuEpaK7izZTqVhhXL1piyu5A$lqWlkxCDbq0H3haa79hX0npzRphBlt7syl3UM2MNJS7ZgYYk76kNZSO!ZRaBz19phzewChIaE2Seub1h0U3JJI7PH1a5Ej6ozVaFUCSGvULtLeQeq!drnnvnqCfK4UZmbNYrHUPBMif2ttgHygUxSRQpMHx$tstSzESKn6XuQo4k!Fuiq5Du1ClQtPE$fgyYuzl4SDkw0RJYBY5dl227vyhKQzyxrSQQUQsKy08xM2LRZUymBp$oDiWBF4ZJv8iE5fDMuwbTRSfPX45uBKiDYSYcOXukcDeYYXturEpUD4VaC0RYF5KVBos1kTT2sQFq$cbkN9jiwmhBC7Yea6LEw64GOq67dlf$yvJmw5L8Sxb!Yd2u$PX2cQh4d19LpvkLTaqhofHmYP9agwBwxLQ4z4z93gkPmgKdGir40bV$nbDNcve6juK4Ct6R$Xid6nkdWM$9RWvQE7m7S7Rf5X8dWEHn86g6cLfi4saH5jOi1abRRYlBixuz3yiRQy!IOOvoH0RVqpamMy03xqGUscyuxjrTYhT1AMBmDaj$l9qgIMN3sS5EONMxMEFXvTo1!3vNCRhuahOt5bsN7WyLpiQiKb76onr8!j9l1QDwNm74OIXSQ2T1OgQeppxh3B5vkx4c8$t8$GfBCq4Q!dDZWu!PNdbRk2sWgGnD$OVXHJgvQZPkJPdQJSm7p85tlx3sh7vCDVBauxtbHz$iXqS5HIj8PX!ZmG20iYl5$H$ZA1e$nYfeD$rafvfJDYmKH9sgLPtP2N5LqNI6SIzrihs7U0ST7iTDzJrw9tMGLFrmtEZ!G8mlzMRBLUsTMFyTa5!r043dtVxSsNdcor2xkUhvJVjjnfuyNNmbd5GoxUxhoyqb0Xx5RuwGFevo!PEZ$FHiNjLzds0LXH20$6QXhWa2k9e4VOO6Far4iutjtXFf!qMQCpeBH2TcpGbbjjziBj$pKzCYhbLnUYL8lBN6sP381fn8MgT2M4WKAXm!N83VRULxtxx7spdeQKvM5Fx6CcMThAZXDOtcoqXMWXOaXt9sY6xSsnbq4ZvrPi8s4v17p95iCpNoJY2KZP4qiWgfcxir1iOYmWIU9$DCSb3jmJz6QzCVCdvy3XKLjropmAce89vi9U4W9v7abEwdKD1!4zdUBMlhRSLo3AX4uLpdDbc7!icy$tdFrrPhBV6VvZDoYXwYbCD91z6I$thUPyk50ct9MVx$dXRXEW8rpdVavkcuae1wOLgC36naRV$P3ciba8qoqFQqewxnhBdUi9rz33lo86lS6K6PPtOD!00D0SY9m48yyjUgqF9uYFq9tAXMoZZ6LruqS5WcVHcVEw6LocLJvyWZwy!8zKFtA5whK08PbAnz2BCTnM$$YPwssO!!$l5v1qz61VXerSg6V0$$eA1JyiZRF$0ErSFtwM51gnD7qXnlIMQ8krXmuUcWdbrvTKUOsY!6t8MfYvlPZDsJz$WaJDCT2TLHqjJRlGvr7CiBncg5S1!5hS6eQAhDw3fcw3ghO5fcIeDT!doP1E0W!MPbqSzWrrGXdYbtcfj5iqShrnDkizgD3E7q8zbBMa9kL3NaCBt2UP!jOULCeTIC3LxrSmhKCgHnhrsuyPaJg6e4jGr0n1Xj1K2gKybs4AIAOyAfEPqZEt$6WSrtp$3O

View File

@@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIID8zCCAtugAwIBAgIUYL/dZNSITnL3uvCDT62CVzoHeKMwDQYJKoZIhvcNAQEL
BQAwgYgxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwI
U2hhbmdoYWkxDzANBgNVBAoMBmZsc3dsZDEPMA0GA1UECwwGZmxzd2xkMQ8wDQYD
VQQDDAZmbHN3bGQxIDAeBgkqhkiG9w0BCQEWEWZsc3dsZEBmbHN3bGQuY29tMB4X
DTIyMDQyNjE3MjYwN1oXDTMyMDQyMzE3MjYwN1owgYgxCzAJBgNVBAYTAkNOMREw
DwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwIU2hhbmdoYWkxDzANBgNVBAoMBmZs
c3dsZDEPMA0GA1UECwwGZmxzd2xkMQ8wDQYDVQQDDAZmbHN3bGQxIDAeBgkqhkiG
9w0BCQEWEWZsc3dsZEBmbHN3bGQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAp4bjl/JavfVApTELsgNhGxwlXY+Z4SoVz8a+KVogdZf0fdMt62ob
YMwg7mg9r5dUmfvfvHhtFjCjviR+sKkS6Dgfc+xwS2ap4DWNwk/7kpmDr/QYTqb9
XO8kUAQ+zPxU0rfPE8KbdCvTlTh4opCMWde8C3BvWExNcKBgb132pHlZNwJTDs7G
laa1T9aSoDz+I9qb91acKnWsDm9NumQ86L1pJgZ+DylzBkVAwTHbMgURLM6hGGmW
RHaYKOnHb/s91YxgO1pN56IL6M2tZQuydt8pMC1Tt3z8yZR2nqAPVvF3j0U1Xh2+
X9iKL9zAsCXgw+nQt/s9QWFP70Pr95hQ8wIDAQABo1MwUTAdBgNVHQ4EFgQU0HwJ
oRLZWEVg9itEpy1VI04MefkwHwYDVR0jBBgwFoAU0HwJoRLZWEVg9itEpy1VI04M
efkwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAK2vphvnVGONT
GBdb8khlPGVf+2caAy5+LrgxX77wQy4aRO//e8r040awzkhN4C8eC2ozGLifzTKy
zxNKWNp163c4v2i0PGx4gdAS7yfLMklUndntiV/uPdk4jZ7Vr4eTciN+Sf0FdUUR
K7tpq0HNHrI6q+29B8Eq1ClkBYAmJqnHllu1EmpNReXkPOOaadpv2pjoJDmIWumI
wCKs4uGZburgX9jBsFHuyRDYOkG+1OGL4zKZClMuEFNodOa3zm4WrBPzWM3WOBZ9
uHLCXkRnce192OopnaytxEEoxuKCQ3lQZzrcuoz1wRfczTBh2pUU4YR1L6oBNuG+
oC9MpDAcmw==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAp4bjl/JavfVApTELsgNhGxwlXY+Z4SoVz8a+KVogdZf0fdMt
62obYMwg7mg9r5dUmfvfvHhtFjCjviR+sKkS6Dgfc+xwS2ap4DWNwk/7kpmDr/QY
Tqb9XO8kUAQ+zPxU0rfPE8KbdCvTlTh4opCMWde8C3BvWExNcKBgb132pHlZNwJT
Ds7Glaa1T9aSoDz+I9qb91acKnWsDm9NumQ86L1pJgZ+DylzBkVAwTHbMgURLM6h
GGmWRHaYKOnHb/s91YxgO1pN56IL6M2tZQuydt8pMC1Tt3z8yZR2nqAPVvF3j0U1
Xh2+X9iKL9zAsCXgw+nQt/s9QWFP70Pr95hQ8wIDAQABAoIBAD7rNHOO/HG3uO3R
+9iB2Gi8K3R2SI7+pW6B8E3LocFIrvTK6cYu9dVnFT81O2XFamri5Gb+u8nHvtfd
EQ/8kDNTUMzTEmHfTxH8Sx+dtpiau5DMFo0Dvsi2sGa1EXkflCQIEOgVARmilDbJ
HNXBgFUF54RMWCVLkxInydBJ9CZVKUVgN5xmUTnLOEINbcn3V8d2aLwSYjECW5Gm
22QzrA05dKvmc6Io776Sc2fNDnJHTkHMrxH+kQ+c2jnHLWvdMb3aCJh/4JDAF/Iq
CZ6EsXBBYJ7C3ZRMata3LEgGU44L2oOZpUcd+RNldcvaBN8T86hxiyHddC9DC+AE
+svJIgECgYEA3H2EBQeVDjJ6PGE/elHJwRyWWtb9xxd7hbJkDfqw+SMEX2pYKnf5
tftXKbPY+U09Sm78Mbdac7W+O7IfD1e00/EDIcjdmq4S2CMGNtQ4GQxfxsFzg2LH
ujtVtx/xuvCNQbgNOEXl+/127AQpSDkhPxD2Tm1WoH72UXS82Ydq9HMCgYEAwoHF
ucrscqPRsg9AVb0UbecbJjRjQD+BudGmOkm0d/QCsjANRJYpSoQ9jP39uqYWlh4f
JAe+H89UWdDTVtFWL14+//nLNqPeCAu70RYt+xajvGAWUCRYaZvECBQW5stzHnHv
p2LG6TSyRbs10vBHxSkxgDe1Ng5+7jjJe09KkYECgYASu5c71ikTy7YW6yw5eDlr
7sHXdeyZvaUA9ucJSQNAJ3l3odFbylWs4G3HXUBR7f4HFObYUnuc2RQQflGlPA5g
81kQxcAOJDv1oQQmJGGfvy1j9Yua3gmaCPB/XndrKoTV0I1O+qFPh3lTFAdt22y3
rvk+MIvrlt3WjdR9psOvgQKBgGOvhtq1uYD3nJ0ZW+uVQEcjTrLB3qwq4B2P6RWu
eKORl2AjaGliXD8ojzMXaVajkKfXQDaDEVnUNHLjp6yzFOyp7LfcGd4jFcQh31xF
dcNd0wTUahsgxX86qblKMoKOeq17z0uGQFN9AnDiha9aHi5Z8li4NFNEEqGc0QY1
mQ4BAoGALmY+k+sL3jdjZ7XwJTuCfPka/UQP32osWzZMCvalts5I73Osyr9+o3sC
gptDMTOmUIh6xxY2pshM6i6etKgyDA7r9utUe+w6pvMIrDG1uZva/2oj0jzQrRq5
X9F3C/MJVMcVSI6Uk+rvBb8QtltKovbN/JX+nlKrIp2FDNuj8zg=
-----END RSA PRIVATE KEY-----

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -0,0 +1,38 @@
package controller
import (
"github.com/gin-gonic/gin"
"hk4e/logger"
"net/http"
"os"
)
func (c *Controller) headDataVersions(context *gin.Context) {
context.Header("Content-Type", "application/octet-stream")
context.Header("Content-Length", "514")
context.Status(http.StatusOK)
}
func (c *Controller) getDataVersions(context *gin.Context) {
dataVersions, err := os.ReadFile("static/data_versions")
if err != nil {
logger.LOG.Error("open data_versions error")
return
}
context.Data(http.StatusOK, "application/octet-stream", dataVersions)
}
func (c *Controller) headBlk(context *gin.Context) {
context.Header("Content-Type", "application/octet-stream")
context.Header("Content-Length", "14103")
context.Status(http.StatusOK)
}
func (c *Controller) getBlk(context *gin.Context) {
blk, err := os.ReadFile("static/29342328.blk")
if err != nil {
logger.LOG.Error("open 29342328.blk error")
return
}
context.Data(http.StatusOK, "application/octet-stream", blk)
}

View File

@@ -0,0 +1,144 @@
package controller
import (
"encoding/base64"
"github.com/gin-gonic/gin"
pb "google.golang.org/protobuf/proto"
"hk4e/common/config"
"hk4e/common/region"
"hk4e/dispatch/dao"
"hk4e/logger"
"net/http"
"strconv"
)
type Controller struct {
dao *dao.Dao
regionListBase64 string
regionCurrBase64 string
signRsaKey []byte
encRsaKeyMap map[string][]byte
pwdRsaKey []byte
}
func NewController(dao *dao.Dao) (r *Controller) {
r = new(Controller)
r.dao = dao
r.regionListBase64 = ""
r.regionCurrBase64 = ""
regionCurr, regionList := region.InitRegion(config.CONF.Hk4e.KcpAddr, config.CONF.Hk4e.KcpPort)
r.signRsaKey, r.encRsaKeyMap, r.pwdRsaKey = region.LoadRsaKey()
regionCurrModify, err := pb.Marshal(regionCurr)
if err != nil {
logger.LOG.Error("Marshal QueryCurrRegionHttpRsp error")
return nil
}
r.regionCurrBase64 = base64.StdEncoding.EncodeToString(regionCurrModify)
regionListModify, err := pb.Marshal(regionList)
if err != nil {
logger.LOG.Error("Marshal QueryRegionListHttpRsp error")
return nil
}
r.regionListBase64 = base64.StdEncoding.EncodeToString(regionListModify)
r.runEngine()
return r
}
func (c *Controller) runEngine() {
if config.CONF.Logger.Level == "DEBUG" {
gin.SetMode(gin.DebugMode)
} else {
gin.SetMode(gin.ReleaseMode)
}
go func() {
engine := c.registerRouter()
port := config.CONF.HttpPort
addr := ":" + strconv.FormatInt(int64(port), 10)
err := engine.Run(addr)
if err != nil {
logger.LOG.Error("gin run error: %v", err)
}
}()
}
func (c *Controller) registerRouter() *gin.Engine {
engine := gin.Default()
{
// 404
engine.NoRoute(func(context *gin.Context) {
logger.LOG.Info("no route find, fallback to fuck mhy, url: %v", context.Request.RequestURI)
context.Header("Content-type", "text/html; charset=UTF-8")
context.Status(http.StatusNotFound)
_, _ = context.Writer.WriteString("FUCK MHY")
})
}
{
// 调度
// dispatchosglobal.yuanshen.com
engine.GET("/query_security_file", c.query_security_file)
engine.GET("/query_region_list", c.query_region_list)
// osusadispatch.yuanshen.com
engine.GET("/query_cur_region", c.query_cur_region)
}
{
// 登录
// hk4e-sdk-os.hoyoverse.com
// 账号登录
engine.POST("/hk4e_global/mdk/shield/api/login", c.apiLogin)
// token登录
engine.POST("/hk4e_global/mdk/shield/api/verify", c.apiVerify)
// 获取combo token
engine.POST("/hk4e_global/combo/granter/login/v2/login", c.v2Login)
}
{
// BLK文件补丁下载
// autopatchhk.yuanshen.com
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.headDataVersions)
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.getDataVersions)
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.headBlk)
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.getBlk)
}
{
// 日志
engine.POST("/sdk/dataUpload", c.sdkDataUpload)
engine.GET("/perf/config/verify", c.perfConfigVerify)
engine.POST("/perf/dataUpload", c.perfDataUpload)
engine.POST("/log", c.log8888)
engine.POST("/crash/dataUpload", c.crashDataUpload)
}
{
// 返回固定数据
// Windows
engine.GET("/hk4e_global/mdk/agreement/api/getAgreementInfos", c.getAgreementInfos)
engine.POST("/hk4e_global/combo/granter/api/compareProtocolVersion", c.postCompareProtocolVersion)
engine.POST("/account/risky/api/check", c.check)
engine.GET("/combo/box/api/config/sdk/combo", c.combo)
engine.GET("/hk4e_global/combo/granter/api/getConfig", c.getConfig)
engine.GET("/hk4e_global/mdk/shield/api/loadConfig", c.loadConfig)
engine.POST("/data_abtest_api/config/experiment/list", c.list)
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-version.json", c.version10Json)
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-zh-cn.json", c.zhCN10Json)
engine.GET("/geetestV2.html", c.geetestV2)
// Android
engine.POST("/common/h5log/log/batch", c.batch)
engine.GET("/hk4e_global/combo/granter/api/getFont", c.getFont)
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-version.json", c.version9Json)
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-zh-cn.json", c.zhCN9Json)
engine.GET("/hk4e_global/combo/granter/api/compareProtocolVersion", c.getCompareProtocolVersion)
// Android geetest
engine.GET("/gettype.php", c.gettype)
engine.GET("/get.php", c.get)
engine.POST("/ajax.php", c.ajax)
engine.GET("/ajax.php", c.ajax)
engine.GET("/static/appweb/app3-index.html", c.app3Index)
engine.GET("/static/js/slide.7.8.6.js", c.slideJs)
engine.GET("/favicon.ico", c.faviconIco)
engine.GET("/static/js/gct.e7810b5b525994e2fb1f89135f8df14a.js", c.js)
engine.GET("/static/ant/style_https.1.2.6.css", c.css)
engine.GET("/pictures/gt/a330cf996/a330cf996.webp", c.webp)
engine.GET("/pictures/gt/a330cf996/bg/86f9db021.webp", c.bgWebp)
engine.GET("/pictures/gt/a330cf996/slice/86f9db021.png", c.slicePng)
engine.GET("/static/ant/sprite2x.1.2.6.png", c.sprite2xPng)
}
return engine
}

View File

@@ -0,0 +1,144 @@
package controller
import (
"bytes"
"encoding/base64"
"github.com/gin-gonic/gin"
"hk4e/common/utils/endec"
"hk4e/dispatch/entity/api"
"hk4e/logger"
"math"
"net/http"
"os"
"regexp"
"strconv"
)
func (c *Controller) query_security_file(context *gin.Context) {
file, err := os.ReadFile("static/security_file")
if err != nil {
logger.LOG.Error("open security_file error")
return
}
context.Header("Content-type", "text/html; charset=UTF-8")
_, _ = context.Writer.WriteString(string(file))
}
func (c *Controller) query_region_list(context *gin.Context) {
context.Header("Content-type", "text/html; charset=UTF-8")
_, _ = context.Writer.WriteString(c.regionListBase64)
}
func (c *Controller) query_cur_region(context *gin.Context) {
versionName := context.Query("version")
response := "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="
if len(context.Request.URL.RawQuery) > 0 {
response = c.regionCurrBase64
}
reg, err := regexp.Compile("[0-9]+")
if err != nil {
logger.LOG.Error("compile regexp error: %v", err)
return
}
versionSlice := reg.FindAllString(versionName, -1)
version := 0
for index := 0; index < len(versionSlice); index++ {
v, err := strconv.Atoi(versionSlice[index])
if err != nil {
logger.LOG.Error("parse client version error: %v", err)
return
}
for i := 0; i < len(versionSlice)-1-index; i++ {
v *= 10
}
version += v
}
if version >= 1000 {
// 测试版本
version /= 10
}
if version >= 275 {
logger.LOG.Debug("do hk4e 2.8 rsa logic")
if context.Query("dispatchSeed") == "" {
rsp := &api.QueryCurRegionRspJson{
Content: response,
Sign: "TW9yZSBsb3ZlIGZvciBVQSBQYXRjaCBwbGF5ZXJz",
}
context.JSON(http.StatusOK, rsp)
return
}
keyId := context.Query("key_id")
encPubPrivKey, exist := c.encRsaKeyMap[keyId]
if !exist {
logger.LOG.Error("can not found key id: %v", keyId)
return
}
regionInfo, err := base64.StdEncoding.DecodeString(response)
if err != nil {
logger.LOG.Error("decode region info error: %v", err)
return
}
chunkSize := 256 - 11
regionInfoLength := len(regionInfo)
numChunks := int(math.Ceil(float64(regionInfoLength) / float64(chunkSize)))
encryptedRegionInfo := make([]byte, 0)
for i := 0; i < numChunks; i++ {
from := i * chunkSize
to := int(math.Min(float64((i+1)*chunkSize), float64(regionInfoLength)))
chunk := regionInfo[from:to]
pubKey, err := endec.RsaParsePubKeyByPrivKey(encPubPrivKey)
if err != nil {
logger.LOG.Error("parse rsa pub key error: %v", err)
return
}
privKey, err := endec.RsaParsePrivKey(encPubPrivKey)
if err != nil {
logger.LOG.Error("parse rsa priv key error: %v", err)
return
}
encrypt, err := endec.RsaEncrypt(chunk, pubKey)
if err != nil {
logger.LOG.Error("rsa enc error: %v", err)
return
}
decrypt, err := endec.RsaDecrypt(encrypt, privKey)
if err != nil {
logger.LOG.Error("rsa dec error: %v", err)
return
}
if bytes.Compare(decrypt, chunk) != 0 {
logger.LOG.Error("rsa dec test fail")
return
}
encryptedRegionInfo = append(encryptedRegionInfo, encrypt...)
}
signPrivkey, err := endec.RsaParsePrivKey(c.signRsaKey)
if err != nil {
logger.LOG.Error("parse rsa priv key error: %v", err)
return
}
signData, err := endec.RsaSign(regionInfo, signPrivkey)
if err != nil {
logger.LOG.Error("rsa sign error: %v", err)
return
}
ok, err := endec.RsaVerify(regionInfo, signData, &signPrivkey.PublicKey)
if err != nil {
logger.LOG.Error("rsa verify error: %v", err)
return
}
if !ok {
logger.LOG.Error("rsa verify test fail")
return
}
rsp := &api.QueryCurRegionRspJson{
Content: base64.StdEncoding.EncodeToString(encryptedRegionInfo),
Sign: base64.StdEncoding.EncodeToString(signData),
}
context.JSON(http.StatusOK, rsp)
return
} else {
context.Header("Content-type", "text/html; charset=UTF-8")
_, _ = context.Writer.WriteString(response)
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,33 @@
package controller
import "github.com/gin-gonic/gin"
// POST https://log-upload-os.mihoyo.com/sdk/dataUpload HTTP/1.1
func (c *Controller) sdkDataUpload(context *gin.Context) {
context.Header("Content-type", "application/json")
_, _ = context.Writer.WriteString("{\"code\":0}")
}
// GET http://log-upload-os.hoyoverse.com/perf/config/verify?device_id=dd664c97f924af747b4576a297c132038be239291651474673768&platform=2&name=DESKTOP-EDUS2DL HTTP/1.1
func (c *Controller) perfConfigVerify(context *gin.Context) {
context.Header("Content-type", "application/json")
_, _ = context.Writer.WriteString("{\"code\":0}")
}
// POST http://log-upload-os.hoyoverse.com/perf/dataUpload HTTP/1.1
func (c *Controller) perfDataUpload(context *gin.Context) {
context.Header("Content-type", "application/json")
_, _ = context.Writer.WriteString("{\"code\":0}")
}
// POST http://overseauspider.yuanshen.com:8888/log HTTP/1.1
func (c *Controller) log8888(context *gin.Context) {
context.Header("Content-type", "application/json")
_, _ = context.Writer.WriteString("{\"code\":0}")
}
// POST http://log-upload-os.hoyoverse.com/crash/dataUpload HTTP/1.1
func (c *Controller) crashDataUpload(context *gin.Context) {
context.Header("Content-type", "application/json")
_, _ = context.Writer.WriteString("{\"code\":0}")
}

View File

@@ -0,0 +1,271 @@
package controller
import (
"encoding/base64"
"encoding/json"
"github.com/gin-gonic/gin"
appConfig "hk4e/common/config"
"hk4e/common/utils/endec"
"hk4e/common/utils/httpclient"
"hk4e/common/utils/random"
"hk4e/dispatch/entity/api"
"hk4e/dispatch/entity/db"
"hk4e/logger"
"net/http"
"regexp"
"strconv"
"strings"
)
type SdkUserLoginReq struct {
Username string `json:"username"`
Password string `json:"password"`
}
type SdkUserLoginRsp struct {
Code int32 `json:"code"`
Msg string `json:"msg"`
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
Data struct {
Uid int32 `json:"uid"`
Username string `json:"username"`
} `json:"data"`
}
func (c *Controller) apiLogin(context *gin.Context) {
requestData := new(api.LoginAccountRequestJson)
err := context.ShouldBindJSON(requestData)
if err != nil {
logger.LOG.Error("parse LoginAccountRequestJson error: %v", err)
return
}
encPwdData, err := base64.StdEncoding.DecodeString(requestData.Password)
if err != nil {
logger.LOG.Error("decode password enc data error: %v", err)
return
}
pwdPrivKey, err := endec.RsaParsePrivKey(c.pwdRsaKey)
if err != nil {
logger.LOG.Error("parse rsa key error: %v", err)
return
}
pwdDecData, err := endec.RsaDecrypt(encPwdData, pwdPrivKey)
useAtAtMode := false
if err != nil {
logger.LOG.Debug("rsa dec error: %v", err)
logger.LOG.Debug("password rsa dec fail, fallback to @@ mode")
useAtAtMode = true
} else {
logger.LOG.Debug("password dec: %v", string(pwdDecData))
useAtAtMode = false
}
responseData := api.NewLoginResult()
var username string
var password string
if useAtAtMode {
// 账号格式检查 用户名6-20字符 密码8-20字符 用户名和密码公用account字段 第一次出现的@@视为分割标识 username@@password
if len(requestData.Account) > 20+20+2 {
responseData.Retcode = -201
responseData.Message = "用户名或密码长度超限"
context.JSON(http.StatusOK, responseData)
return
}
if !strings.Contains(requestData.Account, "@@") {
responseData.Retcode = -201
responseData.Message = "用户名同密码均填写到用户名输入框,填写格式为:用户名@@密码,密码输入框填写任意字符均可"
context.JSON(http.StatusOK, responseData)
return
}
atIndex := strings.Index(requestData.Account, "@@")
username = requestData.Account[:atIndex]
password = requestData.Account[atIndex+2:]
} else {
username = requestData.Account
password = string(pwdDecData)
}
if len(username) < 6 || len(username) > 20 {
responseData.Retcode = -201
responseData.Message = "用户名为6-20位字符"
context.JSON(http.StatusOK, responseData)
return
}
if len(password) < 8 || len(password) > 20 {
responseData.Retcode = -201
responseData.Message = "密码为8-20位字符"
context.JSON(http.StatusOK, responseData)
return
}
ok, err := regexp.MatchString("^[a-zA-Z0-9]{6,20}$", username)
if err != nil || !ok {
responseData.Retcode = -201
responseData.Message = "用户名只能包含大小写字母和数字"
context.JSON(http.StatusOK, responseData)
return
}
// SDK账号登陆
sdkUserLoginRsp, err := httpclient.Post[SdkUserLoginRsp](appConfig.CONF.Hk4e.LoginSdkUrl, &SdkUserLoginReq{
Username: username,
Password: password,
}, "")
// TODO 测试账号
{
sdkUserLoginRsp = &SdkUserLoginRsp{
Code: 0,
Msg: "",
AccessToken: "",
RefreshToken: "",
Data: struct {
Uid int32 `json:"uid"`
Username string `json:"username"`
}{
Uid: 267042405,
Username: "FlourishingWorld",
},
}
err = nil
}
if err != nil {
responseData.Retcode = -201
responseData.Message = "服务器内部错误:-1"
context.JSON(http.StatusOK, responseData)
return
}
if sdkUserLoginRsp.Code != 0 {
responseData.Retcode = -201
responseData.Message = sdkUserLoginRsp.Msg
context.JSON(http.StatusOK, responseData)
return
}
// 登录成功
account, err := c.dao.QueryAccountByField("username", username)
if err != nil {
logger.LOG.Error("query account from db error: %v", err)
return
}
if account == nil {
// 注册一个原神account
playerID, err := c.dao.GetNextYuanShenUid()
if err != nil {
responseData.Retcode = -201
responseData.Message = "服务器内部错误:-2"
context.JSON(http.StatusOK, responseData)
return
}
regAccount := &db.Account{
Uid: uint64(sdkUserLoginRsp.Data.Uid),
Username: username,
PlayerID: playerID,
Token: base64.StdEncoding.EncodeToString(random.GetRandomByte(24)),
ComboToken: "",
}
_, err = c.dao.InsertAccount(regAccount)
if err != nil {
responseData.Retcode = -201
responseData.Message = "服务器内部错误:-3"
context.JSON(http.StatusOK, responseData)
return
}
responseData.Message = "OK"
responseData.Data.Account.Uid = strconv.FormatInt(int64(regAccount.Uid), 10)
responseData.Data.Account.Token = regAccount.Token
responseData.Data.Account.Email = regAccount.Username
} else {
// 生产新的token
account.Token = base64.StdEncoding.EncodeToString(random.GetRandomByte(24))
_, err := c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "token", account.Token)
if err != nil {
responseData.Retcode = -201
responseData.Message = "服务器内部错误:-4"
context.JSON(http.StatusOK, responseData)
return
}
responseData.Message = "OK"
responseData.Data.Account.Uid = strconv.FormatInt(int64(account.Uid), 10)
responseData.Data.Account.Token = account.Token
responseData.Data.Account.Email = account.Username
}
context.JSON(http.StatusOK, responseData)
}
func (c *Controller) apiVerify(context *gin.Context) {
requestData := new(api.LoginTokenRequest)
err := context.ShouldBindJSON(requestData)
if err != nil {
logger.LOG.Error("parse LoginTokenRequest error: %v", err)
return
}
uid, err := strconv.ParseInt(requestData.Uid, 10, 64)
if err != nil {
logger.LOG.Error("parse uid error: %v", err)
return
}
account, err := c.dao.QueryAccountByField("uid", uid)
if err != nil {
logger.LOG.Error("query account from db error: %v", err)
return
}
responseData := api.NewLoginResult()
if account == nil || account.Token != requestData.Token {
responseData.Retcode = -111
responseData.Message = "账号本地缓存信息错误"
context.JSON(http.StatusOK, responseData)
return
}
responseData.Message = "OK"
responseData.Data.Account.Uid = requestData.Uid
responseData.Data.Account.Token = requestData.Token
responseData.Data.Account.Email = account.Username
context.JSON(http.StatusOK, responseData)
}
func (c *Controller) v2Login(context *gin.Context) {
requestData := new(api.ComboTokenReq)
err := context.ShouldBindJSON(requestData)
if err != nil {
logger.LOG.Error("parse ComboTokenReq error: %v", err)
return
}
data := requestData.Data
if len(data) == 0 {
logger.LOG.Error("requestData.Data len == 0")
return
}
loginData := new(api.LoginTokenData)
err = json.Unmarshal([]byte(data), loginData)
if err != nil {
logger.LOG.Error("Unmarshal LoginTokenData error: %v", err)
return
}
uid, err := strconv.ParseInt(loginData.Uid, 10, 64)
if err != nil {
logger.LOG.Error("ParseInt uid error: %v", err)
return
}
responseData := api.NewComboTokenRes()
account, err := c.dao.QueryAccountByField("uid", uid)
if account == nil || account.Token != loginData.Token {
responseData.Retcode = -201
responseData.Message = "token错误"
context.JSON(http.StatusOK, responseData)
return
}
// 生成新的comboToken
account.ComboToken = random.GetRandomByteHexStr(20)
_, err = c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "comboToken", account.ComboToken)
if err != nil {
responseData.Retcode = -201
responseData.Message = "服务器内部错误:-1"
context.JSON(http.StatusOK, responseData)
return
}
responseData.Message = "OK"
responseData.Data.OpenID = loginData.Uid
responseData.Data.ComboID = "0"
responseData.Data.ComboToken = account.ComboToken
context.JSON(http.StatusOK, responseData)
}

126
dispatch/dao/account_dao.go Normal file
View File

@@ -0,0 +1,126 @@
package dao
import (
"context"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
dbEntity "hk4e/dispatch/entity/db"
"hk4e/logger"
)
func (d *Dao) GetNextYuanShenUid() (uint64, error) {
db := d.db.Collection("player_id_counter")
find := db.FindOne(context.TODO(), bson.D{{"_id", "default"}})
item := new(dbEntity.PlayerIDCounter)
err := find.Decode(item)
if err != nil {
if err == mongo.ErrNoDocuments {
item := &dbEntity.PlayerIDCounter{
ID: "default",
PlayerID: 100000001,
}
_, err := db.InsertOne(context.TODO(), item)
if err != nil {
return 0, errors.New("insert new PlayerID error")
}
return item.PlayerID, nil
} else {
return 0, err
}
}
item.PlayerID++
_, err = db.UpdateOne(
context.TODO(),
bson.D{
{"_id", "default"},
},
bson.D{
{"$set", bson.D{
{"PlayerID", item.PlayerID},
}},
},
)
if err != nil {
return 0, err
}
return item.PlayerID, nil
}
func (d *Dao) InsertAccount(account *dbEntity.Account) (primitive.ObjectID, error) {
db := d.db.Collection("account")
id, err := db.InsertOne(context.TODO(), account)
if err != nil {
return primitive.ObjectID{}, err
} else {
_id, ok := id.InsertedID.(primitive.ObjectID)
if !ok {
logger.LOG.Error("get insert id error")
return primitive.ObjectID{}, nil
}
return _id, nil
}
}
func (d *Dao) DeleteAccountByUsername(username string) (int64, error) {
db := d.db.Collection("account")
deleteCount, err := db.DeleteOne(
context.TODO(),
bson.D{
{"username", username},
},
)
if err != nil {
return 0, err
} else {
return deleteCount.DeletedCount, nil
}
}
func (d *Dao) UpdateAccountFieldByFieldName(fieldName string, fieldValue any, fieldUpdateName string, fieldUpdateValue any) (int64, error) {
db := d.db.Collection("account")
updateCount, err := db.UpdateOne(
context.TODO(),
bson.D{
{fieldName, fieldValue},
},
bson.D{
{"$set", bson.D{
{fieldUpdateName, fieldUpdateValue},
}},
},
)
if err != nil {
return 0, err
} else {
return updateCount.ModifiedCount, nil
}
}
func (d *Dao) QueryAccountByField(fieldName string, fieldValue any) (*dbEntity.Account, error) {
db := d.db.Collection("account")
find, err := db.Find(
context.TODO(),
bson.D{
{fieldName, fieldValue},
},
)
if err != nil {
return nil, err
}
result := make([]*dbEntity.Account, 0)
for find.Next(context.TODO()) {
item := new(dbEntity.Account)
err := find.Decode(item)
if err != nil {
return nil, err
}
result = append(result, item)
}
if len(result) == 0 {
return nil, nil
} else {
return result[0], nil
}
}

34
dispatch/dao/dao.go Normal file
View File

@@ -0,0 +1,34 @@
package dao
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"hk4e/common/config"
"hk4e/logger"
)
type Dao struct {
client *mongo.Client
db *mongo.Database
}
func NewDao() (r *Dao) {
r = new(Dao)
clientOptions := options.Client().ApplyURI(config.CONF.Database.Url)
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
logger.LOG.Error("mongo connect error: %v", err)
return nil
}
r.client = client
r.db = client.Database("gate_hk4e")
return r
}
func (d *Dao) CloseDao() {
err := d.client.Disconnect(context.TODO())
if err != nil {
logger.LOG.Error("mongo close error: %v", err)
}
}

View File

@@ -0,0 +1,15 @@
package api
type ComboTokenReq struct {
AppID int `json:"app_id"`
ChannelID int `json:"channel_id"`
Data string `json:"data"`
Device string `json:"device"`
Sign string `json:"sign"`
}
type LoginTokenData struct {
Uid string `json:"uid"`
Token string `json:"token"`
Guest bool `json:"guest"`
}

View File

@@ -0,0 +1,34 @@
package api
type ComboTokenRes struct {
Message string `json:"message"`
Retcode int `json:"retcode"`
Data LoginData `json:"data"`
}
type LoginData struct {
AccountType int `json:"account_type"`
Heartbeat bool `json:"heartbeat"`
ComboID string `json:"combo_id"`
ComboToken string `json:"combo_token"`
OpenID string `json:"open_id"`
Data string `json:"data"`
FatigueRemind any `json:"fatigue_remind"`
}
func NewComboTokenRes() (r *ComboTokenRes) {
r = &ComboTokenRes{
Message: "",
Retcode: 0,
Data: LoginData{
AccountType: 1,
Heartbeat: false,
ComboID: "",
ComboToken: "",
OpenID: "",
Data: "{\"guest\":false}",
FatigueRemind: nil,
},
}
return r
}

View File

@@ -0,0 +1,7 @@
package api
type LoginAccountRequestJson struct {
Account string `json:"account"`
Password string `json:"password"`
IsCrypto bool `json:"is_crypto"`
}

View File

@@ -0,0 +1,74 @@
package api
type LoginResult struct {
Message string `json:"message"`
Retcode int `json:"retcode"`
Data VerifyData `json:"data"`
}
type VerifyData struct {
Account VerifyAccountData `json:"account"`
DeviceGrantRequired bool `json:"device_grant_required"`
RealnameOperation string `json:"realname_operation"`
RealpersonRequired bool `json:"realperson_required"`
SafeMobileRequired bool `json:"safe_mobile_required"`
}
type VerifyAccountData struct {
Uid string `json:"uid"`
Name string `json:"name"`
Email string `json:"email"`
Mobile string `json:"mobile"`
IsEmailVerify string `json:"is_email_verify"`
Realname string `json:"realname"`
IdentityCard string `json:"identity_card"`
Token string `json:"token"`
SafeMobile string `json:"safe_mobile"`
FacebookName string `json:"facebook_name"`
TwitterName string `json:"twitter_name"`
GameCenterName string `json:"game_center_name"`
GoogleName string `json:"google_name"`
AppleName string `json:"apple_name"`
SonyName string `json:"sony_name"`
TapName string `json:"tap_name"`
Country string `json:"country"`
ReactivateTicket string `json:"reactivate_ticket"`
AreaCode string `json:"area_code"`
DeviceGrantTicket string `json:"device_grant_ticket"`
}
func NewLoginResult() (r *LoginResult) {
r = &LoginResult{
Message: "",
Retcode: 0,
Data: VerifyData{
Account: VerifyAccountData{
Uid: "",
Name: "",
Email: "",
Mobile: "",
IsEmailVerify: "0",
Realname: "",
IdentityCard: "",
Token: "",
SafeMobile: "",
FacebookName: "",
TwitterName: "",
GameCenterName: "",
GoogleName: "",
AppleName: "",
SonyName: "",
TapName: "",
Country: "CN",
ReactivateTicket: "",
AreaCode: "**",
DeviceGrantTicket: "",
},
DeviceGrantRequired: false,
RealnameOperation: "None",
RealpersonRequired: false,
SafeMobileRequired: false,
},
}
return r
}

View File

@@ -0,0 +1,6 @@
package api
type LoginTokenRequest struct {
Uid string `json:"uid"`
Token string `json:"token"`
}

View File

@@ -0,0 +1,6 @@
package api
type QueryCurRegionRspJson struct {
Content string `json:"content"`
Sign string `json:"sign"`
}

View File

@@ -0,0 +1,14 @@
package db
import "go.mongodb.org/mongo-driver/bson/primitive"
type Account struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
Uid uint64 `bson:"uid"`
Username string `bson:"username"`
PlayerID uint64 `bson:"playerID"`
Token string `bson:"token"`
ComboToken string `bson:"comboToken"`
Forbid bool `bson:"forbid"`
ForbidEndTime uint64 `bson:"forbidEndTime"`
}

View File

@@ -0,0 +1,6 @@
package db
type PlayerIDCounter struct {
ID string `bson:"_id"`
PlayerID uint64 `bson:"PlayerID"`
}

View File

@@ -0,0 +1,6 @@
package gm
type ForbidUserInfo struct {
UserId uint32
ForbidEndTime uint64
}

View File

@@ -0,0 +1,81 @@
package service
import (
"hk4e/dispatch/dao"
"hk4e/dispatch/entity/gm"
)
type Service struct {
dao *dao.Dao
}
// 用户密码改变
func (f *Service) UserPasswordChange(uid uint32) bool {
// dispatch登录态失效
_, err := f.dao.UpdateAccountFieldByFieldName("uid", uid, "token", "")
if err != nil {
return false
}
// 游戏内登录态失效
account, err := f.dao.QueryAccountByField("uid", uid)
if err != nil {
return false
}
if account == nil {
return false
}
//convId, exist := f.getConvIdByUserId(uint32(account.PlayerID))
//if !exist {
// return true
//}
//f.kcpEventInput <- &net.KcpEvent{
// ConvId: convId,
// EventId: net.KcpConnForceClose,
// EventMessage: uint32(kcp.EnetAccountPasswordChange),
//}
return true
}
// 封号
func (f *Service) ForbidUser(info *gm.ForbidUserInfo) bool {
if info == nil {
return false
}
// 写入账号封禁信息
_, err := f.dao.UpdateAccountFieldByFieldName("uid", info.UserId, "forbid", true)
if err != nil {
return false
}
_, err = f.dao.UpdateAccountFieldByFieldName("uid", info.UserId, "forbidEndTime", info.ForbidEndTime)
if err != nil {
return false
}
// 游戏强制下线
account, err := f.dao.QueryAccountByField("uid", info.UserId)
if err != nil {
return false
}
if account == nil {
return false
}
//convId, exist := f.getConvIdByUserId(uint32(account.PlayerID))
//if !exist {
// return true
//}
//f.kcpEventInput <- &net.KcpEvent{
// ConvId: convId,
// EventId: net.KcpConnForceClose,
// EventMessage: uint32(kcp.EnetServerKillClient),
//}
return true
}
// 解封
func (s *Service) UnForbidUser(uid uint32) bool {
// 解除账号封禁
_, err := s.dao.UpdateAccountFieldByFieldName("uid", uid, "forbid", false)
if err != nil {
return false
}
return true
}