From b884f2856954482876bfb4804f0ff15e41197550 Mon Sep 17 00:00:00 2001 From: flashwave Date: Sun, 3 Jul 2022 22:07:00 +0000 Subject: [PATCH] Initial import --- .gitattributes | 1 + .gitignore | 2 + .gitmodules | 3 + lib/index | 1 + mince.php | 46 +++++ public/assets/bg_main.png | Bin 0 -> 434 bytes public/assets/bg_top.png | Bin 0 -> 1067 bytes public/assets/dirt-x4.png | Bin 0 -> 3129 bytes public/assets/minecraft.eot | Bin 0 -> 11302 bytes public/assets/minecraft.svg | 347 +++++++++++++++++++++++++++++++++++ public/assets/minecraft.woff | Bin 0 -> 7524 bytes public/assets/weblogo.png | Bin 0 -> 31111 bytes public/favicon.ico | Bin 0 -> 154423 bytes public/index.php | 244 ++++++++++++++++++++++++ public/mince.css | 157 ++++++++++++++++ src/ChatAuth.php | 76 ++++++++ src/HTML.php | 48 +++++ src/Remote.php | 45 +++++ src/ServerQuery.php | 166 +++++++++++++++++ src/Utils.php | 14 ++ src/Whitelist.php | 67 +++++++ 21 files changed, 1217 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .gitmodules create mode 160000 lib/index create mode 100644 mince.php create mode 100644 public/assets/bg_main.png create mode 100644 public/assets/bg_top.png create mode 100644 public/assets/dirt-x4.png create mode 100644 public/assets/minecraft.eot create mode 100644 public/assets/minecraft.svg create mode 100644 public/assets/minecraft.woff create mode 100644 public/assets/weblogo.png create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/mince.css create mode 100644 src/ChatAuth.php create mode 100644 src/HTML.php create mode 100644 src/Remote.php create mode 100644 src/ServerQuery.php create mode 100644 src/Utils.php create mode 100644 src/Whitelist.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f61408c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.debug +/config/config.ini diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..19f950d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/index"] + path = lib/index + url = https://github.com/flashwave/index.git diff --git a/lib/index b/lib/index new file mode 160000 index 0000000..8a5423f --- /dev/null +++ b/lib/index @@ -0,0 +1 @@ +Subproject commit 8a5423fea397e2f2adca0b9f46d1e5c21fd13c44 diff --git a/mince.php b/mince.php new file mode 100644 index 0000000..c2bea0b --- /dev/null +++ b/mince.php @@ -0,0 +1,46 @@ +Unable to connect to database'; + die($ex->getMessage()); +} + +Remote::setUrl($config['remote_url']); +Remote::setSecret($config['remote_secret']); + +if(empty($_COOKIE['mc_random'])) { + $sVerification = Utils::generatePassKey(32); + setcookie('mc_random', $sVerification, strtotime('1 day'), '/', $_SERVER['HTTP_HOST']); +} else + $sVerification = (string)filter_input(INPUT_COOKIE, 'mc_random'); + +$sVerification = hash('sha256', $sVerification); + +// replace this with id.flashii.net shit +$userInfo = ChatAuth::attempt($db, $config['chat_endpoint'], $config['chat_secret'], (string)filter_input(INPUT_COOKIE, 'msz_auth')); diff --git a/public/assets/bg_main.png b/public/assets/bg_main.png new file mode 100644 index 0000000000000000000000000000000000000000..e4abed3a77cae38faa5b3b00d557818e765596c6 GIT binary patch literal 434 zcmV;j0ZsmiP)Ow)^n*;6o4%06bYyKU!rZeDR5M^lQf>+&L{blO^$B`?Nt%!_^BE57__ zZWg!uK}o@(1YZAq`u!a&fVJ=Y(_vsWG9B5rZC9ee6Xt>#h9NK3b-g+aQh*30T4fc; z*w9!(z^Wua@I&4*vI=BuXwVBM7C8^NKzB;OGmWf>jFS&8>}&xbRwAo4uw2O2$co5V z3!G|2L3oQx3q^NUnT{*~6ljV)Q>j&gE6ggZxXZY6o>8`&?dG?QWl1vGJ(^$S33%SKj;cABPQ*`T!20T<=4%MV>;Af-$KgELIw zt5(|OM};x+#0gK7*`RXY1#?InV+AsvIB|Wbw9-oN7WD5%rcXZg=wZ+`G50 zoqyxXn>+uH>5Q)&?{C|KM?S1H-I8vflglw%*>WD(5K^W3E$Q8MX%`N+V>9Smy)z|&x^+lRvX-oGSnD+UKXFwgap<(CEGbA&eeDV@;yqZ`8W*MnC%d@Ip zqVGq^EG)H?$*cMTXhbk!i0Vd_M~W~ms@20(Swk>AkLtCQz3GKAnG6`44gZELX11GH zDj|z?K2 z2fPXn{se|z1wXu6M(3Q)yFo81*r1m?Fmg3mc;SNe54CauD$X>-aFkXy8?;ida&XW) zV$@<)dd>dv+cZOs9FMX9qzikUH2{k zUCJjDA7w&Oa8a96%$XwutA~kHMqX0QLxzl!t?S69PY$?&|n8^jS6*hNP#OQmxqNPIZ5P#T6f|Tm(^EjeXs_c1J#2A#D=a z548c>-*I&e(XSitWzK5hNGF99?$ECzwGGc9M51^=xF7zRDa;&}>Olq5K@-n0-#E83Wl3j{zOzKrS)j1=~Qe|Pp z)iDjP*-E=!0lAH5s18tBq0vUKK$p9F=+$aelgVQE6GAq>RvWZby`O@~8H$?Wn~A>K zTj_RFU##>a_ww-$t2ix;OR)G2x+@4JALiLbAlqoy%L+q=(qq%xZ<;faF`wPr$Ht|~ znl7*xL|k0z3Z2Sg9$qQL_|6vqK5W&YpXpDNNvV*>Q&HA+FCtr2GJtOtEW_s|ZMnR4 zhNPayTuzbuYW8E9(_xk-HDsj%=RAx!=L0WfCfbKqsDGfzU>fKuDVfTOeub%>yZ?49 zHYCPdZIJc~EG@u>7qh$DD?~iO4-qpAM^Pbm%iV>~!i$M+>j=*P#YNqRBuNM60si@7 lxMSGd22))fEiius7yu*93!?jEVq^dS002ovPDHLkV1iBf_*nn| literal 0 HcmV?d00001 diff --git a/public/assets/dirt-x4.png b/public/assets/dirt-x4.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1e0f8a1db6efeaa53efb6939f25273e60ab815 GIT binary patch literal 3129 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 T-zv(i00000NkvXXu0mjfxz)#3 literal 0 HcmV?d00001 diff --git a/public/assets/minecraft.eot b/public/assets/minecraft.eot new file mode 100644 index 0000000000000000000000000000000000000000..db6b255da8a5e0d7b79af200390d2daa5194cd54 GIT binary patch literal 11302 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 + + + +Created by FontForge 20090622 at Sun Nov 12 10:48:06 2017 + By ffonts +Copyright \(c\) 2017 by Jacob Debono. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/minecraft.woff b/public/assets/minecraft.woff new file mode 100644 index 0000000000000000000000000000000000000000..d7098330e38f8b3e346d25b4284d96fd56670cac GIT binary patch literal 7524 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 literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..522b384a9221cea11e82da2eb5748bfd3d157d68 GIT binary patch literal 154423 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�KG zTSgxJ+f$u)JQ_v&GUY0Dd3AqZbqf{7Z^z$uX!VB8uO>y@u;csoH-C93uH-LE7CpJ} z#HP|eAADzHW@yspF*Dz~HNJde?c>v`|1fjm>u+Sm%zW#;2TM1udUfgd)&F<;>67<; z7uD&`o`V(@t=#ua{G$hB3eu8p`2ETa-#iyRFmd|M8#jD+=ycC3XQezaJ}xq9`kG#8 zr~dNw=Rdsn?q5Hh5^>pkF+cg_$e;EW{PX$$_m@u|f93KQ4t{qPj+xWhx{n{(TnB*< z|2Wy85ROmtd(c&j@4mf#(XoY;t7)%X_Fm_2*IssQ*8Mj=wDpIhB(}w;tf;c^z~E^& z#*@1a4@m9{1jSg!*J-zDE1GiO6trpLw1Lbw#e2N7&81BNoBx+Ke?8^S=D#Nj{kY$| z@i)maQJIihJVTk#BPmar5Yn@+GJ#0p7T=GXG;IQVH-4GChuh>m+$QhgHhB-X&Ho== znX&o*qhndCB5d=&RmpkLMdrresPr;rLTuJ>)fC9~Kdg6}GC}qSox4UW6MCl=DHDh~ zZuneu)VlN#a-+A&d$^n8J>J>;|Irr+oBuz07Pcq@Hvd~hzKi~2H~z}`n{3~^$7d@O za>rk%yaBWChuiGy;g;_``2)ftl?g;`xBOi6)W7fuy3xz#|AlABdB(uz|9K|(MV6e+ z|BH+vt&EOW{FVK^?Ay)0A8z^H)Ayd{`|`c)|K)f=`epd;@dIeQQV&F1H+r-(tuMyt z-16(GfA_>coBtOhi<`vB=D%J4U1h+o|Ce0*@8T`B0@0GcRaI5W1lfMe_FlgC)W6H` z<$AA-&r|;{`)}#@^u2uVX?$=A>_6N5H};fl{=1*QG3!3uvOdcCE8pAozsa%H#qiRu z|Ce_CcjIpsX%a9&_P4S=OTV|_<@eGrVuQo4kixhL`b6zs>)q z&+|xrN`6bf3@`a1{gNN@y(hoT|EBrpi9eEGp8PUC>6hPo;$Iu&f0OOIq@TCrb5Hz` z@yqbu`sI8>e(x>+WqtPKm*vNkU$*zs@9FziSU<4&Z`=uy^!CJW`CfkS$uIdW{hq$J z`R{(e$FBcg&kyYSZ`XfU8IbGuvVZpEm;J3=zmxBai;I;BGQ78bPx#6HU$(EF+FwuY zy?igzOG-*oCdl-?^_zDS;1+8G;HxL&;yndCWB`4JU&%lD-sC;pGQ78biI4P4 zen@)T{C8i!m-O@Gm;9CdlkaW*yWdBW<j9-3l_Wf|n_nz>P?^}ERXY=2^J@&*OIbN{& z-*kIy*MIl%zo+sg>$~*Z_1}HJ!EXOsw*KR3{xADq>6iVjCw|EAvVD+#8Qzm$elOc+ z*?!CVCBw`5D*f_%Pw~s}-lo?I=L6ive>VT!`+slwA^BxAj%lUr*o5_wswm zPfz@j;bnc7ew+W^^~aw0CHW`Ad-BWgB|mNcyN?%S`!DI&(*9nK2W0%7-b;SV@8x@m zZ%gZER#uiW!BhR0=}CV}zdzUgzof6Er=+*!pQraSe)+w8FXQv{Ug9h1@2URF@Fwr! zZYlp-`n}D6_x*oaK5YJ?@_YGS#^>q1#8=j5yZ(FE z|4aHyzbAgk@RHw>U(zqX_vDw~%l20CU%r=qS$@3r%lJI`J;i^n_y4@*r?=s4{=3Vg zmgT|bf7AO3cKvU$d{VFae^2zb>%aT@p{&2MetYuE@1_4-xBrsgp7`tOz3h)={PMl* zA7pr$o~Q7#znAp%#1BvJWqfkIN%|!|GJYAK^tbl@pIra(L~n23Oa995<$F*3wE5p+ z{S{5N|B^qF-rl~K{FUF!_cs5V?oaIc@4o)ysl3ScR<@_I{q@!_Z^hc7qZrq};ueV2Y&|787?eoysNhPUf~)9XWa{kQACSq5;2OMu+(k$$)EQof6<@3MY+ zx^FA%ySIK%_21k0Vk@$h39^4~sbBWz(l6te@1Ak1=nY6e>ncyjW#EgN;gs8a%$^`j+kD)2b1X&-GMmtnf zAj3zLCMy%|f=3IezFpCtsN$zc>4SxQE<0!wqD3v+svH ze!&noh`rjOOz2*isNA49Np)`mWPcDgI9{31wXlyeLAL)b^~?2X={M{Cx#<5TKc!#t zL%z59@2*eU+wvg!E&VqC-TQyL{ZnN&gZPtCb&AJb_S@+>K>pt9O-G|$(`*53eA8xbm!)?}mxMlq`>ptA_ zz4Y7l-){fSG9b%`^tX2VFXg|<`YZji{!70MFYEuHwbPXe1#6}#6B4f}QYQ4&~=8IbL_^vm{M`ek^#{dZpvG~0f-&9)zI z+1^XPS@+>?Y5jLN9Lj{^^;atsVy_vjOh{N%q}*U(p-M0yhQ{b7m}~!V=Ps*ugUov- zDiiYe%~2){e&QNsg6!X=f5LOOC=<+Y;g<6Ov+r-nJ^Z=rlnExTaCaG$;0Ch)H}?+U z4spb~f#iRmk@>1A2ndT*CfNLUU+*z_54X+#GqwZW_W#Vf54TzO;Wq0&+-`LrZGlnu z;Wq0&+;;tU-#@hLzuo?uW#B@$|8oCd*8l!X$El`3)_=J^C;LmYZ*Rz*yJxm)3e35G zL+(`R_jdZ>sL&on8O!`frv2yZ!%hwf~Y|IoC~4Cdm4q zFmH%5Vc`AKlnJs=m-8>_m*Ktj7d$psnNafdVr4?bu@%Y$*}h->i|xvU$ zGGMm-aGPyE+_L?a?Y;EN@ZS2(wjXY@?T6cJ`{B0RfA{mEX5EK7dS<>GNdA`XyH1&4 z&ZXfVc67NL%y|7yWkSCPrz#W7y?MBcpSso!((a$AOfdKQ;U4^OjT_84zC)QH@yU94 zx-y~kP>nJ{ra$QM`O1XxM>i-Fu6^$zWy07a>y-%uc3q`RkmYgY3#*g~L!Vr%Ob9E8 zQ*MwStHKOu?f&29zkB&Jc@MYAd$>*B!)@{&Zj<+L+x)ldzgY&%x(~Nm_u+P{`)CV{ zx(~Nq|Lyi)lmYTKY25bz%(*DsiFc2613A7j`%bv!{<}GshWo15wzOi2IvBxQok-|V;UQ6|XotC<(Lr@nl<8<=$+ zZn?K1=_SKU|NJ+$D-(#*Zv1SL^VUnZ@HYQ#{+ne$)<3)c+x6cp1G0Uz+kf}|>_^c4 zd+H+G`iBAcO;slJ-9BD51x>AeAlK{b$js2bBqC-w(H^{!^~kOaII_?ov&G zoZm^m?4PAyjz6S7>7H@Qg!o&AD-+J5fA_>+Pw#F18)ZWBTlyuxrC;(}`c2-$ZSo#& zoBwwG7iGXx{cY)cyZ*QB`tPayxRnpNKVa^K!!7%Bb8j7PxnE<>wc(cIP1*m;^;OxI z%lPH@D}TFRnNab>YGr~s_J!NrD}Y;`AC&3!e`uOAVdjfll?kG5gSHpDvH5T88QJ`I zKmTLbfA{l8X5EL|tov|NWp}Gj7klNG_}cBi`}yHE(EfWWqHg7R$o-3y337d2`pv!< zZrQ#T9$2VMnELi6WrEyKn0$PLGC{82OMXfJ#OH5SO@Unh8uI8oWrD0Po``n|ytnyp zlmVOncKsJ+;1a0fO=iKa|82YeH(5ADU5HM9nsLHeto-K0#A=WV3F z{F!B{DOhy;=gI_`A5WRL-@DIuOy0w7^Z$}BA#VMH&HqcD-!g+X|0P9izexeN@-gAi z24#X=4=~UA!!6GndOE)?&-nL(TXO_Hb0zjP}fL=EY0^8~uY2_X3`{g-(5+kEyUzooy;6X+5rfaJII zU*g$!&z@=>F3}aftUXJ;8p})`pw{o!1kLI zu<2n^!!93od1&qO;MU-v2{sdGj^FseYQgIxXrA8{ffc+SgXa335pZyhp!t3sL49y5 z0&n~jff*bTc;|Ny?S(I%s9gt&Uxr_MxSS6xr}3}#%0S-`^a???EcD)Kc~ia96y(Hr zj~}RdB;_gSB+tsq(t2#5(*`o`A*Z%`VWNUALoLsibYDi4CR@7hhNfsen$VpGotm)~ z*;?*B^xQEvP_|85c;gMMl4d$X{z;|6c?+isw%CA z6nY79=Nd9la2FeL4sb^iXOy7F0OtW9ix7H4Au|Z_2XWsCXAU7F0e4|=#|LNFa4!*e z5ul3zd)7F&h`Wcl4~ct(LvEa*b*<>T5p-S@_rh^j0lEWlM**^gaL)lU6CmSI>p3NP zV35@U`HQ$4fwK#^uYh}qxQ77wi8#B6HE`TRhumW5D8LykrUMM^L3q$`X zGBHjA{`-+Z8So|3n@sC*xZ#*$E^zv7HUFq@V7ot=T*H9>;5}?Mmyv0hduRVN`vRwL z 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 S6Bk-;>woGrr>~{$?EeQcQub#6 literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..3ad7c11 --- /dev/null +++ b/public/index.php @@ -0,0 +1,244 @@ +lap('httpfx', 'HttpFx Created'); + +$loginUrl = $config['login_url']; + +$router->setDefaultErrorHandler(function($response, $request, $code, $text) use ($loginUrl, $userInfo) { + $body = HTML::getHeader($userInfo, $loginUrl, sprintf('%03d %s', $code, $text)); + $body .= '
'; + $body .= sprintf('

HTTP %03d

', $code); + $body .= sprintf('

%s

', $text); + $body .= '
'; + $body .= HTML::getFooter(); + $response->setContent($body); +}); + +$router->use('/', function($response) use ($timing) { + $response->setPoweredBy('Mince+Index'); + $response->setServerTiming($timing); +}); + +$router->get('/index.php', function($response) { + $response->redirect('/', true); +}); +$router->get('/map.php', function($response) { + $response->redirect('/maps/survival', true); +}); + +$router->get('/', function($response, $request) use ($db, $loginUrl, $userInfo, $sVerification) { + $name = (string)$request->getParam('name'); + $error = (string)$request->getParam('error'); + + if(!empty($error) && ctype_lower($error)) { + $errors = [ + 'request' => ['Invalid request type.', 'Try to reload the page and try again.'], + 'verify' => ['Request verification failed.', 'Try to reload the page and try again.'], + 'itainthappenin' => ['Haha', 'No'], + 'short' => ['Invalid username', 'The provided name is too short.'], + 'long' => ['Invalid username', 'The provided name is too long.'], + 'invalid' => ['Invalid username', 'The provided name contains invalid characters.'], + 'conflict' => ['Username conflict', 'This username is already whitelisted with someone, contact flashwave if this is unexpected.'], + 'connect' => ['Failed to connect to the server', 'The server is probably offline, pope flashwave if this is not expected.'], + 'not-listed' => ['You have not been whitelisted yet', 'Add yourself to the whitelist before trying to remove yourself from it.'], + ]; + + if(array_key_exists($error, $errors)) { + $mErrorTitle = $errors[$error][0]; + $mErrorComment = $errors[$error][1]; + } else { + $mErrorTitle = 'Unexpected response from server'; + $mErrorComment = $error; + } + } + + $body = HTML::getHeader($userInfo, $loginUrl); + + if(!empty($mErrorTitle)) { + $body .= '
'; + $body .= sprintf('

%s

', $mErrorTitle); + $body .= sprintf('

%s

', $mErrorComment ?? 'No further details provided.'); + $body .= '
'; + } + + if($userInfo->success) { + if($userInfo->mc_whitelisted < 1) { + $body .= '
'; + $body .= '

Add to Whitelist

'; + $body .= '

This will give you access to the server.

'; + $body .= '
'; + $body .= sprintf(' ', $sVerification); + $body .= ' '; + $body .= ' '; + $body .= '
'; + $body .= '
'; + } + + $body .= '
'; + + $body .= '
'; + $body .= '

Bedrock versions

'; + $body .= '

Through the black magic bestowed upon us by GeyserMC it\'s possible to play on the server through any of the updated Bedrock versions of Minecraft.

'; + $body .= '

This should allow you to play on the server from a phone, a tablet or a console, provided you also have an account for the original version of the game.

'; + $body .= '

You will need to link your Minecraft and Bedrock accounts, you can do this by connecting to link.geysermc.org in both versions of the game and following the on-screen instructions.

'; + $body .= '

Unfortunately, the Bedrock versions of the game don\'t support SRV records, so you\'ll have to join with a different address:

'; + //$body .= '
mcb.flashii.net:19132
'; + $body .= '

Also down, lol!

'; + $body .= '
'; + + if($userInfo->mc_whitelisted > 0) { + $body .= '
'; + $body .= '

Remove from Whitelist

'; + $body .= '

This will revoke your access to the server.

'; + $body .= sprintf('

You are currently whitelisted as %s on %s.

', $userInfo->mc_username, date('Y-m-d H:i:s T', $userInfo->mc_whitelisted)); + $body .= '
'; + $body .= sprintf(' ', $sVerification); + $body .= ' '; + $body .= '
'; + $body .= '
'; + } + + $body .= '
'; + $body .= '

All Of Fabric 5 (1.3.0)

'; + $body .= '
aof.flashii.net
'; + $body .= '

An SRV record is used, so no port needs to be specified.

'; + $body .= '

There\'s a pack for MultiMC/PolyMC somewhere and you\'ll probably need Adoptium Java 17 to actually be able to launch the game. Other launchers work completely fine though, probably.

'; + $body .= '

This server doesn\'t currently use a whitelist, so you don\'t have to worry about that.

'; + $body .= '
'; + } else { + $body .= '
'; + $body .= '

You must be logged in to use this website!

'; + $body .= '

This website allows you to whitelist yourself on our Minecraft server, for which you need to be logged in.

'; + $body .= '

So it doesn\'t make sense to display the details either.

'; + $body .= '
'; + } + + $body .= '
'; + $body .= '

Rules

'; + $body .= '

1. Observe Global Rules.

'; + $body .= '

2. Don\'t be an asshole.

'; + $body .= '

3. Don\'t flood.

'; + $body .= '
'; + + $body .= HTML::getFooter(); + + return $body; +}); + +$router->get('/maps', function($response) { + $response->redirect('/maps/survival'); +}); +$router->get('/maps/survival', function($response) use ($loginUrl, $userInfo) { + $body = HTML::getHeader($userInfo, $loginUrl); + + $body .= '
'; + $body .= ' '; + $body .= '
'; + + $body .= HTML::getFooter(); + + return $body; +}); + +$router->use('/whitelist', function($response, $request) use ($sVerification) { + if(!$request->isFormContent()) { + $response->redirect('/?error=request'); + return true; + } + + $body = $request->getContent(); + + if(!$body->hasParam('boob') || !hash_equals($sVerification, (string)$body->getParam('boob'))) { + $response->redirect('/?error=verify'); + return true; + } +}); + +$router->post('/whitelist/add', function($response, $request) use ($db, $userInfo) { + if($userInfo->user_id == 45) { + $response->redirect('/?error=itainthappenin'); + return true; + } + + $body = $request->getContent(); + $name = (string)$body->getParam('name'); + $resp = Whitelist::add($db, $userInfo, $name); + + if($resp === '') + $response->redirect('/'); + else { + if($resp === 'invalid') + $name = ''; + $response->redirect("/?error={$resp}&name={$name}"); + } +}); + +$router->post('/whitelist/remove', function($response) use ($db, $userInfo) { + $resp = Whitelist::remove($db, $userInfo); + + if($resp === '') + $response->redirect('/'); + else + $response->redirect("/?error={$resp}"); +}); + +$router->get('/status', function($response) { + $response->redirect('/status/survival'); +}); + +$router->get('/status/survival', function() { + return 'todo: make something here'; +}); + +$router->get('/status/survival.json', function() { + return ServerQuery::create('mc.flashii.net')->stats(); +}); + +$router->get('/status/survival.png', function($response) { + $stats = ServerQuery::create('mc.flashii.net')->stats(); + + $image = new \Imagick; + $image->newImage(100, 100, 'black', 'png'); + + $draw = new \ImagickDraw; + $draw->setFillColor('white'); + + $image->annotateImage($draw, 10, 10, 0, $stats->motd); + + $response->setContentType('image/png'); + $response->setContent((string)$image); + + $image->destroy(); +}); + +$router->get('/errors/:code', function($res, $req, $code) { + $code = intval($code); + if($code < 100 || $code >= 600) + $code = 400; + return $code; +}); + +$timing->lap('routes'); + +$router->dispatch(); diff --git a/public/mince.css b/public/mince.css new file mode 100644 index 0000000..7132715 --- /dev/null +++ b/public/mince.css @@ -0,0 +1,157 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + position: relative; + outline-style: none; +} + +a, a:active, a:visited { + color: #aaf; + text-decoration: none; +} + +html, +body, +.wrapper { + width: 100%; + height: 100%; +} + +body { + background: #111 url('/assets/bg_main.png'); + color: #e0d0d0; + font: 13px/1.4 'Helvetica Neue', sans-serif; +} + +.wrapper {} + +.header { + background: #211710 url('/assets/bg_top.png'); + height: 48px; + overflow: hidden; +} +.header-inner { + max-width: 1000px; + width: 100%; + margin: 0 auto; + display: flex; + align-items: center; +} +.header-fat { + flex: 1 1 auto; +} +.header-logo { + flex: 0 0 auto; +} +.header-logo img { + vertical-align: bottom; +} +.header-user { + flex: 0 0 auto; + font-size: 16px; + font-weight: 700; + text-decoration: none; +} + +.footer { + color: #444; + height: 26px; + width: 100%; + text-align: center; + padding-top: 14px; +} + +.content { + max-width: 1000px; + width: 100%; + margin: 0 auto; + margin-top: 1em; + padding: 20px 0 40px; +} + +.details p { + margin: .2em 0; +} +.details pre { + font-size: 1.5em; +} + +.error { + margin-bottom: 20px; + color: #f33; +} + +.whitelist { + margin-bottom: 20px; +} +.whitelist input[type="submit"] { + font-size: 1.5em; + margin: 5px; + border-radius: 4px; + padding: 5px 10px; + border: 1px solid #2a2; + background-color: #252; + color: #cfc; + transition: background-color .2s; +} +.whitelist input[type="submit"]:hover, +.whitelist input[type="submit"]:focus { + background-color: #272; +} +.whitelist input[type="submit"]:active { + background-color: #232; +} + +.unwhitelist { + margin-top: 20px; +} +.unwhitelist input[type="submit"] { + font-size: 1.5em; + margin: 5px; + border-radius: 4px; + padding: 5px 10px; + border: 1px solid #a22; + background-color: #522; + color: #fcc; + transition: background-color .2s; +} +.unwhitelist input[type="submit"]:hover, +.unwhitelist input[type="submit"]:focus { + background-color: #722; +} +.unwhitelist input[type="submit"]:active { + background-color: #322; +} + +label { + margin-top: 1em; + display: block; +} +label .label-header { + text-transform: uppercase; + font-size: 10px; + color: #AAA; +} +label .label-input input { + padding: 2px; + display: block; + font-size: 18px; + margin-bottom: 2px; + max-width: 300px; + width: 100%; +} + +.rules { + margin-top: 20px; +} + +.bedrock { + margin-top: 20px; +} +.bedrock pre { + font-size: 1.5em; +} +.bedrock p { + margin: .2em 0; +} diff --git a/src/ChatAuth.php b/src/ChatAuth.php new file mode 100644 index 0000000..3e21dbb --- /dev/null +++ b/src/ChatAuth.php @@ -0,0 +1,76 @@ + 0) { + $loginRequest = [ + 'user_id' => $unpacked['user'], + 'token' => 'SESS:' . $cookie, + 'ip' => $_SERVER['REMOTE_ADDR'], + ]; + $loginSignature = hash_hmac('sha256', implode('#', $loginRequest), $secret); + + $login = curl_init($endPoint); + curl_setopt_array($login, [ + CURLOPT_AUTOREFERER => false, + CURLOPT_FAILONERROR => false, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HEADER => false, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode($loginRequest), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TCP_FASTOPEN => true, + CURLOPT_CONNECTTIMEOUT => 2, + CURLOPT_MAXREDIRS => 2, + CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, + CURLOPT_TIMEOUT => 5, + CURLOPT_USERAGENT => 'mc.flashii.net', + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'X-SharpChat-Signature: ' . $loginSignature, + ], + ]); + $userInfo = json_decode(curl_exec($login)); + curl_close($login); + } + } + + if(empty($userInfo->success)) { + $userInfo = new stdClass; + $userInfo->success = false; + $userInfo->user_id = 0; + $userInfo->username = 'Anonymous'; + $userInfo->colour_raw = 0x40000000; + $userInfo->rank = 0; + $userInfo->hierarchy = 0; + $userInfo->is_silenced = '1970-01-01T00:00:00+00:00'; + $userInfo->perms = 0; + $userInfo->mc_username = null; + $userInfo->mc_whitelisted = 0; + } else { + $getWhitelist = $db->prepare('SELECT `minecraft_username`, UNIX_TIMESTAMP(`whitelist_added`) AS `whitelist_added` FROM `whitelist_2022` WHERE `flashii_id` = ?'); + $getWhitelist->addParameter(1, $userInfo->user_id); + $getWhitelist->execute(); + $whitelist = $getWhitelist->getResult(); + + if($whitelist->next()) { + $userInfo->mc_username = $whitelist->getString(0); + $userInfo->mc_whitelisted = $whitelist->getInteger(1); + } else { + $userInfo->mc_username = null; + $userInfo->mc_whitelisted = 0; + } + } + + return $userInfo; + } +} diff --git a/src/HTML.php b/src/HTML.php new file mode 100644 index 0000000..d1da8e7 --- /dev/null +++ b/src/HTML.php @@ -0,0 +1,48 @@ +success) { + $userBar = 'Logged in as ' . $userInfo->username; + } else { + $userBar = 'Log in'; + } + + return << + + + + {$title} + + + +
+ +
+HTML; + } + + public static function getFooter(): string { + return << +
+ Flashwave 2022 | Site design "borrowed" from pre-Microsoft Mojang | "Minecraft" is a trademark of Mojang +
+
+ + +HTML; + } +} diff --git a/src/Remote.php b/src/Remote.php new file mode 100644 index 0000000..cd83d28 --- /dev/null +++ b/src/Remote.php @@ -0,0 +1,45 @@ + false, + CURLOPT_FAILONERROR => false, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HEADER => false, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => [ + 'm' => $mode, + 's' => $sign, + 'n' => $name, + ], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TCP_FASTOPEN => true, + CURLOPT_CONNECTTIMEOUT => 2, + CURLOPT_MAXREDIRS => 2, + CURLOPT_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS, + CURLOPT_TIMEOUT => 5, + CURLOPT_USERAGENT => 'mc.flashii.net', + ]); + $response = curl_exec($request); + curl_close($request); + + return $response; + } +} diff --git a/src/ServerQuery.php b/src/ServerQuery.php new file mode 100644 index 0000000..8af8c2b --- /dev/null +++ b/src/ServerQuery.php @@ -0,0 +1,166 @@ +addr = (string)$addr; + $this->port = $port; + $this->sessionId = random_int(0, 0x7FFFFFFF) & 0x0F0F0F0F; + $this->socket = socket_create($addr->isV6() ? AF_INET6 : AF_INET, SOCK_DGRAM, SOL_UDP); + $this->handshake(); + } + + public function __destruct() { + socket_close($this->socket); + } + + public function handshake(): void { + $response = $this->send(9); + $length = strlen($response); + $token = ''; + + for($i = 0; $i < $length; ++$i) { + $char = $response[$i]; + if($char === "\0") + break; + $token .= $char; + } + + $this->challengeToken = intval($token); + } + + public function stats(): object { + $response = $this->send(0, pack('N', $this->challengeToken)); + + $offset = 0; + $data = new stdClass; + + $data->motd = self::readString($response, $offset); + $data->gametype = self::readString($response, $offset); + $data->map = self::readString($response, $offset); + $data->numplayers = self::readString($response, $offset); + $data->maxplayers = self::readString($response, $offset); + $data->hostport = unpack('v', substr($response, $offset, 2))[1]; + $offset += 2; + $data->hostip = self::readString($response, $offset); + + return $data; + } + + private static function readString(string $source, int &$offset): string { + $length = strlen($source); + $string = ''; + + for(; $offset < $length; ++$offset) { + $char = $source[$offset]; + if($char === "\0") + break; + $string .= $char; + } + + ++$offset; + + return $string; + } + + private function send(int $type, string $payload = ''): string { + $payload = "\xFE\xFD" . pack('CN', $type, $this->sessionId) . $payload; + socket_sendto($this->socket, $payload, strlen($payload), 0, $this->addr, $this->port); + socket_recv($this->socket, $response, 1024, MSG_WAITALL); + + $data = unpack('Ctype/Nsession', $response); + + if($data['type'] !== $type) + throw new RuntimeException('Type does not match.'); + if($data['session'] !== $this->sessionId) + throw new RuntimeException('Session id does not match.'); + + return substr($response, 5); + } + + public static function create(AString|string $endPoint): ServerQuery { + $endPoint = AString::cast($endPoint); + $firstChar = $endPoint[0]; + + if($firstChar === '[') { // IPv6 + if($endPoint->contains(']:')) + $endPoint = IPEndPoint::parse($endPoint); + else + $endPoint = new IPEndPoint(IPAddress::parse($endPoint->trim('[]')), self::PORT); + + return new ServerQuery($endPoint->getAddress(), $endPoint->getPort()); + } elseif(is_numeric($firstChar)) { // IPv4 + if($endPoint->contains(':')) + $endPoint = IPEndPoint::parse($endPoint); + else + $endPoint = new IPEndPoint(IPAddress::parse($endPoint), self::PORT); + + return new ServerQuery($endPoint->getAddress(), $endPoint->getPort()); + } else { // DNS + if($endPoint->contains(':')) + $endPoint = DnsEndPoint::parse($endPoint); + else { + $endPoint = new DnsEndPoint($endPoint, self::PORT); + + $records = dns_get_record('_minecraft._tcp.' . (string)$endPoint->getHost(), DNS_SRV); + + if(!empty($records)) { + usort($records, function($a, $b) { + $priority = $a['pri'] <=> $b['pri']; + if($priority !== 0) + return $priority; + $weight = $a['weight'] <=> $b['weight']; + if($weight !== 0) + return $priority; + return 0; + }); + + foreach($records as $record) { + try { + return ServerQuery::create($record['target'] . ':' . $record['port']); + } catch(Exception $ex) {} + } + } + } + + $records = dns_get_record((string)$endPoint->getHost(), DNS_A); + + if(!empty($records)) { + foreach($records as $record) { + try { + return new ServerQuery(IPAddress::parse($record['ip']), $endPoint->getPort()); + } catch(Exception $ex) {} + } + } + + $records = dns_get_record((string)$endPoint->getHost(), DNS_AAAA); + + if(!empty($records)) { + foreach($records as $record) { + try { + return new ServerQuery(IPAddress::parse($record['ipv6']), $endPoint->getPort()); + } catch(Exception $ex) {} + } + } + } + + throw new RuntimeException('Failed to connect.'); + } +} diff --git a/src/Utils.php b/src/Utils.php new file mode 100644 index 0000000..807f6e4 --- /dev/null +++ b/src/Utils.php @@ -0,0 +1,14 @@ + 16) + return 'long'; + if(!preg_match('#^([a-zA-Z0-9_]{3,16})$#', $userName)) + return 'invalid'; + + $dupeCheck = $db->prepare('SELECT COUNT(`flashii_id`) > 0 FROM `whitelist_2022` WHERE `minecraft_username` = ?'); + $dupeCheck->addParameter(1, $userName, DbType::STRING); + $dupeCheck->execute(); + $dupeResult = $dupeCheck->getResult(); + + if(!$dupeResult->next()) + return 'dupefail'; + if($dupeResult->getInteger(0)) + return 'conflict'; + + if(!empty($userInfo->mc_whitelisted) || !empty($userInfo->mc_username)) { + $resp = self::remove($db, $userInfo); + if($resp !== '') + return $resp; + } + + $resp = Remote::call('wl:add', $userName); + + if($resp !== 'success') + return $resp; + + $insert = $db->prepare('INSERT INTO `whitelist_2022` (`flashii_id`, `minecraft_username`) VALUES (?, ?)'); + $insert->addParameter(1, $userInfo->user_id); + $insert->addParameter(2, $userName, DbType::STRING); + $insert->execute(); + + $userInfo->mc_username = $userName; + $userInfo->mc_whitelisted = time(); + + return ''; + } + + public static function remove(IDbConnection $db, object $userInfo): string { + if(empty($userInfo->mc_whitelisted) || empty($userInfo->mc_username)) + return 'not-listed'; + + $resp = Remote::call('wl:remove', $userInfo->mc_username); + + if($resp !== 'success') + return $resp; + + $delete = $db->prepare('DELETE FROM `whitelist_2022` WHERE `flashii_id` = ?'); + $delete->addParameter(1, $userInfo->user_id); + $delete->execute(); + + $userInfo->mc_username = null; + $userInfo->mc_whitelisted = 0; + + return ''; + } +}