From 306994f629c872da27bb062c47e8f513a17262c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B8nstantine=20Kovalensky?= <45331093+kovalensky@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:19:25 +0400 Subject: [PATCH] =?UTF-8?q?Timeline=20=E2=80=94=202.4.1=20(#1340)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bt/announce.php | 28 +++++----- common.php | 2 +- composer.json | 1 + filelist.php | 50 +++++++++++------- library/ajax/thanks.php | 49 ++++++++++------- library/attach_mod/displaying_torrent.php | 17 +++--- library/config.php | 4 +- library/includes/functions.php | 1 + library/language/source/main.php | 3 +- src/Ajax.php | 2 +- src/Legacy/Common/User.php | 7 +++ src/Legacy/Torrent.php | 2 +- src/Legacy/TorrentFileList.php | 28 +--------- .../clients/{Ttorrent.png => tTorrent.png} | Bin styles/images/flags/{AD.SVG => AD.svg} | 0 styles/images/flags/{AE.SVG => AE.svg} | 0 styles/images/flags/{AF.SVG => AF.svg} | 0 styles/images/flags/{AG.SVG => AG.svg} | 0 styles/images/flags/{AI.SVG => AI.svg} | 0 styles/images/flags/{AL.SVG => AL.svg} | 0 styles/images/flags/{AM.SVG => AM.svg} | 0 styles/images/flags/{AO.SVG => AO.svg} | 0 styles/images/flags/{AQ.SVG => AQ.svg} | 0 styles/images/flags/{AR.SVG => AR.svg} | 0 styles/images/flags/{ARAB.SVG => ARAB.svg} | 0 styles/images/flags/{AS.SVG => AS.svg} | 0 styles/images/flags/{AT.SVG => AT.svg} | 0 styles/images/flags/{AU.SVG => AU.svg} | 0 styles/images/flags/{AW.SVG => AW.svg} | 0 styles/images/flags/{AX.SVG => AX.svg} | 0 styles/images/flags/{AZ.SVG => AZ.svg} | 0 styles/images/flags/{BA.SVG => BA.svg} | 0 styles/images/flags/{BB.SVG => BB.svg} | 0 styles/images/flags/{BD.SVG => BD.svg} | 0 styles/images/flags/{BE.SVG => BE.svg} | 0 styles/images/flags/{BF.SVG => BF.svg} | 0 styles/images/flags/{BG.SVG => BG.svg} | 0 styles/images/flags/{BH.SVG => BH.svg} | 0 styles/images/flags/{BI.SVG => BI.svg} | 0 styles/images/flags/{BJ.SVG => BJ.svg} | 0 styles/images/flags/{BL.SVG => BL.svg} | 0 styles/images/flags/{BM.SVG => BM.svg} | 0 styles/images/flags/{BN.SVG => BN.svg} | 0 styles/images/flags/{BO.SVG => BO.svg} | 0 styles/images/flags/{BQ.SVG => BQ.svg} | 0 styles/images/flags/{BR.SVG => BR.svg} | 0 styles/images/flags/{BS.SVG => BS.svg} | 0 styles/images/flags/{BT.SVG => BT.svg} | 0 styles/images/flags/{BV.SVG => BV.svg} | 0 styles/images/flags/{BW.SVG => BW.svg} | 0 styles/images/flags/{BY.SVG => BY.svg} | 0 styles/images/flags/{BZ.SVG => BZ.svg} | 0 styles/images/flags/{CA.SVG => CA.svg} | 0 styles/images/flags/{CC.SVG => CC.svg} | 0 styles/images/flags/{CD.SVG => CD.svg} | 0 styles/images/flags/{CEFTA.SVG => CEFTA.svg} | 0 styles/images/flags/{CF.SVG => CF.svg} | 0 styles/images/flags/{CG.SVG => CG.svg} | 0 styles/images/flags/{CH.SVG => CH.svg} | 0 styles/images/flags/{CI.SVG => CI.svg} | 0 styles/images/flags/{CK.SVG => CK.svg} | 0 styles/images/flags/{CL.SVG => CL.svg} | 0 styles/images/flags/{CM.SVG => CM.svg} | 0 styles/images/flags/{CN.SVG => CN.svg} | 0 styles/images/flags/{CO.SVG => CO.svg} | 0 styles/images/flags/{CP.SVG => CP.svg} | 0 styles/images/flags/{CR.SVG => CR.svg} | 0 styles/images/flags/{CU.SVG => CU.svg} | 0 styles/images/flags/{CV.SVG => CV.svg} | 0 styles/images/flags/{CW.SVG => CW.svg} | 0 styles/images/flags/{CX.SVG => CX.svg} | 0 styles/images/flags/{CY.SVG => CY.svg} | 0 styles/images/flags/{CZ.SVG => CZ.svg} | 0 styles/images/flags/{DE.SVG => DE.svg} | 0 styles/images/flags/{DG.SVG => DG.svg} | 0 styles/images/flags/{DJ.SVG => DJ.svg} | 0 styles/images/flags/{DK.SVG => DK.svg} | 0 styles/images/flags/{DM.SVG => DM.svg} | 0 styles/images/flags/{DO.SVG => DO.svg} | 0 styles/images/flags/{DZ.SVG => DZ.svg} | 0 styles/images/flags/{EAC.SVG => EAC.svg} | 0 styles/images/flags/{EC.SVG => EC.svg} | 0 styles/images/flags/{EE.SVG => EE.svg} | 0 styles/images/flags/{EG.SVG => EG.svg} | 0 styles/images/flags/{EH.SVG => EH.svg} | 0 styles/images/flags/{ER.SVG => ER.svg} | 0 styles/images/flags/{ES-CT.SVG => ES-CT.svg} | 0 styles/images/flags/{ES-GA.SVG => ES-GA.svg} | 0 styles/images/flags/{ES-PV.SVG => ES-PV.svg} | 0 styles/images/flags/{ES.SVG => ES.svg} | 0 styles/images/flags/{ET.SVG => ET.svg} | 0 styles/images/flags/{EU.SVG => EU.svg} | 0 styles/images/flags/{FI.SVG => FI.svg} | 0 styles/images/flags/{FJ.SVG => FJ.svg} | 0 styles/images/flags/{FK.SVG => FK.svg} | 0 styles/images/flags/{FM.SVG => FM.svg} | 0 styles/images/flags/{FO.SVG => FO.svg} | 0 styles/images/flags/{FR.SVG => FR.svg} | 0 styles/images/flags/{GA.SVG => GA.svg} | 0 .../images/flags/{GB-ENG.SVG => GB-ENG.svg} | 0 .../images/flags/{GB-NIR.SVG => GB-NIR.svg} | 0 .../images/flags/{GB-SCT.SVG => GB-SCT.svg} | 0 .../images/flags/{GB-WLS.SVG => GB-WLS.svg} | 0 styles/images/flags/{GB.SVG => GB.svg} | 0 styles/images/flags/{GD.SVG => GD.svg} | 0 styles/images/flags/{GE.SVG => GE.svg} | 0 styles/images/flags/{GF.SVG => GF.svg} | 0 styles/images/flags/{GG.SVG => GG.svg} | 0 styles/images/flags/{GH.SVG => GH.svg} | 0 styles/images/flags/{GI.SVG => GI.svg} | 0 styles/images/flags/{GL.SVG => GL.svg} | 0 styles/images/flags/{GM.SVG => GM.svg} | 0 styles/images/flags/{GN.SVG => GN.svg} | 0 styles/images/flags/{GP.SVG => GP.svg} | 0 styles/images/flags/{GQ.SVG => GQ.svg} | 0 styles/images/flags/{GR.SVG => GR.svg} | 0 styles/images/flags/GR3.svg | 15 ++++++ styles/images/flags/{GS.SVG => GS.svg} | 0 styles/images/flags/{GT.SVG => GT.svg} | 0 styles/images/flags/{GU.SVG => GU.svg} | 0 styles/images/flags/{GW.SVG => GW.svg} | 0 styles/images/flags/{GY.SVG => GY.svg} | 0 styles/images/flags/{HK.SVG => HK.svg} | 0 styles/images/flags/{HM.SVG => HM.svg} | 0 styles/images/flags/{HN.SVG => HN.svg} | 0 styles/images/flags/{HR.SVG => HR.svg} | 0 styles/images/flags/{HT.SVG => HT.svg} | 0 styles/images/flags/{HU.SVG => HU.svg} | 0 styles/images/flags/{IC.SVG => IC.svg} | 0 styles/images/flags/{ID.SVG => ID.svg} | 0 styles/images/flags/{IE.SVG => IE.svg} | 0 styles/images/flags/{IL.SVG => IL.svg} | 0 styles/images/flags/{IM.SVG => IM.svg} | 0 styles/images/flags/{IN.SVG => IN.svg} | 0 styles/images/flags/{IO.SVG => IO.svg} | 0 styles/images/flags/{IQ.SVG => IQ.svg} | 0 styles/images/flags/{IR.SVG => IR.svg} | 0 styles/images/flags/{IS.SVG => IS.svg} | 0 styles/images/flags/{IT.SVG => IT.svg} | 0 styles/images/flags/{JE.SVG => JE.svg} | 0 styles/images/flags/{JM.SVG => JM.svg} | 0 styles/images/flags/{JO.SVG => JO.svg} | 0 styles/images/flags/{JP.SVG => JP.svg} | 0 styles/images/flags/{KE.SVG => KE.svg} | 0 styles/images/flags/{KG.SVG => KG.svg} | 0 styles/images/flags/{KH.SVG => KH.svg} | 0 styles/images/flags/{KI.SVG => KI.svg} | 0 styles/images/flags/{KM.SVG => KM.svg} | 0 styles/images/flags/{KN.SVG => KN.svg} | 0 styles/images/flags/{KP.SVG => KP.svg} | 0 styles/images/flags/{KR.SVG => KR.svg} | 0 styles/images/flags/{KW.SVG => KW.svg} | 0 styles/images/flags/{KY.SVG => KY.svg} | 0 styles/images/flags/{KZ.SVG => KZ.svg} | 0 styles/images/flags/{LA.SVG => LA.svg} | 0 styles/images/flags/{LB.SVG => LB.svg} | 0 styles/images/flags/{LC.SVG => LC.svg} | 0 styles/images/flags/{LI.SVG => LI.svg} | 0 styles/images/flags/{LK.SVG => LK.svg} | 0 styles/images/flags/{LR.SVG => LR.svg} | 0 styles/images/flags/{LS.SVG => LS.svg} | 0 styles/images/flags/{LT.SVG => LT.svg} | 0 styles/images/flags/{LU.SVG => LU.svg} | 0 styles/images/flags/{LV.SVG => LV.svg} | 0 styles/images/flags/{LY.SVG => LY.svg} | 0 styles/images/flags/{MA.SVG => MA.svg} | 0 styles/images/flags/{MC.SVG => MC.svg} | 0 styles/images/flags/{MD.SVG => MD.svg} | 0 styles/images/flags/{ME.SVG => ME.svg} | 0 styles/images/flags/{MF.SVG => MF.svg} | 0 styles/images/flags/{MG.SVG => MG.svg} | 0 styles/images/flags/{MH.SVG => MH.svg} | 0 styles/images/flags/{MK.SVG => MK.svg} | 0 styles/images/flags/{ML.SVG => ML.svg} | 0 styles/images/flags/{MM.SVG => MM.svg} | 0 styles/images/flags/{MN.SVG => MN.svg} | 0 styles/images/flags/{MO.SVG => MO.svg} | 0 styles/images/flags/{MP.SVG => MP.svg} | 0 styles/images/flags/{MQ.SVG => MQ.svg} | 0 styles/images/flags/{MR.SVG => MR.svg} | 0 styles/images/flags/{MS.SVG => MS.svg} | 0 styles/images/flags/{MT.SVG => MT.svg} | 0 styles/images/flags/{MU.SVG => MU.svg} | 0 styles/images/flags/{MV.SVG => MV.svg} | 0 styles/images/flags/{MW.SVG => MW.svg} | 0 styles/images/flags/{MX.SVG => MX.svg} | 0 styles/images/flags/{MY.SVG => MY.svg} | 0 styles/images/flags/{MZ.SVG => MZ.svg} | 0 styles/images/flags/{NA.SVG => NA.svg} | 0 styles/images/flags/{NC.SVG => NC.svg} | 0 styles/images/flags/{NE.SVG => NE.svg} | 0 styles/images/flags/{NF.SVG => NF.svg} | 0 styles/images/flags/{NG.SVG => NG.svg} | 0 styles/images/flags/{NI.SVG => NI.svg} | 0 styles/images/flags/{NL.SVG => NL.svg} | 0 styles/images/flags/{NO.SVG => NO.svg} | 0 styles/images/flags/{NP.SVG => NP.svg} | 0 styles/images/flags/{NR.SVG => NR.svg} | 0 styles/images/flags/{NU.SVG => NU.svg} | 0 styles/images/flags/{NZ.SVG => NZ.svg} | 0 styles/images/flags/{OM.SVG => OM.svg} | 0 styles/images/flags/{PA.SVG => PA.svg} | 0 styles/images/flags/{PC.SVG => PC.svg} | 0 styles/images/flags/{PE.SVG => PE.svg} | 0 styles/images/flags/{PF.SVG => PF.svg} | 0 styles/images/flags/{PG.SVG => PG.svg} | 0 styles/images/flags/{PH.SVG => PH.svg} | 0 styles/images/flags/{PK.SVG => PK.svg} | 0 styles/images/flags/{PL.SVG => PL.svg} | 0 styles/images/flags/{PM.SVG => PM.svg} | 0 styles/images/flags/{PN.SVG => PN.svg} | 0 styles/images/flags/{PR.SVG => PR.svg} | 0 styles/images/flags/{PS.SVG => PS.svg} | 0 styles/images/flags/{PT.SVG => PT.svg} | 0 styles/images/flags/{PW.SVG => PW.svg} | 0 styles/images/flags/{PY.SVG => PY.svg} | 0 styles/images/flags/{QA.SVG => QA.svg} | 0 styles/images/flags/{RE.SVG => RE.svg} | 0 styles/images/flags/{RO.SVG => RO.svg} | 0 styles/images/flags/{RS.SVG => RS.svg} | 0 styles/images/flags/{RU.SVG => RU.svg} | 0 styles/images/flags/{RW.SVG => RW.svg} | 0 styles/images/flags/{SA.SVG => SA.svg} | 0 styles/images/flags/{SB.SVG => SB.svg} | 0 styles/images/flags/{SC.SVG => SC.svg} | 0 styles/images/flags/{SD.SVG => SD.svg} | 0 styles/images/flags/{SE.SVG => SE.svg} | 0 styles/images/flags/{SG.SVG => SG.svg} | 0 styles/images/flags/{SH-AC.SVG => SH-AC.svg} | 0 styles/images/flags/{SH-HL.SVG => SH-HL.svg} | 0 styles/images/flags/{SH-TA.SVG => SH-TA.svg} | 0 styles/images/flags/{SH.SVG => SH.svg} | 0 styles/images/flags/{SI.SVG => SI.svg} | 0 styles/images/flags/{SJ.SVG => SJ.svg} | 0 styles/images/flags/{SK.SVG => SK.svg} | 0 styles/images/flags/{SL.SVG => SL.svg} | 0 styles/images/flags/{SM.SVG => SM.svg} | 0 styles/images/flags/{SN.SVG => SN.svg} | 0 styles/images/flags/{SO.SVG => SO.svg} | 0 styles/images/flags/{SR.SVG => SR.svg} | 0 styles/images/flags/{SS.SVG => SS.svg} | 0 styles/images/flags/{ST.SVG => ST.svg} | 0 styles/images/flags/{SU.SVG => SU.svg} | 0 styles/images/flags/{SV.SVG => SV.svg} | 0 styles/images/flags/{SX.SVG => SX.svg} | 0 styles/images/flags/{SY.SVG => SY.svg} | 0 styles/images/flags/{SZ.SVG => SZ.svg} | 0 styles/images/flags/{TC.SVG => TC.svg} | 0 styles/images/flags/{TD.SVG => TD.svg} | 0 styles/images/flags/{TF.SVG => TF.svg} | 0 styles/images/flags/{TG.SVG => TG.svg} | 0 styles/images/flags/{TH.SVG => TH.svg} | 0 styles/images/flags/{TJ.SVG => TJ.svg} | 0 styles/images/flags/{TK.SVG => TK.svg} | 0 styles/images/flags/{TL.SVG => TL.svg} | 0 styles/images/flags/{TM.SVG => TM.svg} | 0 styles/images/flags/{TN.SVG => TN.svg} | 0 styles/images/flags/{TO.SVG => TO.svg} | 0 styles/images/flags/{TR.SVG => TR.svg} | 0 styles/images/flags/{TT.SVG => TT.svg} | 0 styles/images/flags/{TV.SVG => TV.svg} | 0 styles/images/flags/{TW.SVG => TW.svg} | 0 styles/images/flags/{TZ.SVG => TZ.svg} | 0 styles/images/flags/{UA.SVG => UA.svg} | 0 styles/images/flags/{UG.SVG => UG.svg} | 0 styles/images/flags/{UM.SVG => UM.svg} | 0 styles/images/flags/{UN.SVG => UN.svg} | 0 styles/images/flags/{US.SVG => US.svg} | 0 styles/images/flags/{UY.SVG => UY.svg} | 0 styles/images/flags/{UZ.SVG => UZ.svg} | 0 styles/images/flags/{VA.SVG => VA.svg} | 0 styles/images/flags/{VC.SVG => VC.svg} | 0 styles/images/flags/{VE.SVG => VE.svg} | 0 styles/images/flags/{VG.SVG => VG.svg} | 0 styles/images/flags/{VI.SVG => VI.svg} | 0 styles/images/flags/{VN.SVG => VN.svg} | 0 styles/images/flags/{VU.SVG => VU.svg} | 0 styles/images/flags/{WF.SVG => WF.svg} | 0 styles/images/flags/{WS.SVG => WS.svg} | 0 styles/images/flags/{XK.SVG => XK.svg} | 0 styles/images/flags/{XX.SVG => XX.svg} | 0 styles/images/flags/{YE.SVG => YE.svg} | 0 styles/images/flags/{YT.SVG => YT.svg} | 0 styles/images/flags/{ZA.SVG => ZA.svg} | 0 styles/images/flags/{ZM.SVG => ZM.svg} | 0 styles/images/flags/{ZW.SVG => ZW.svg} | 0 styles/images/flags/gg.bat | 1 + styles/images/t_info.png | Bin 0 -> 916 bytes styles/templates/default/css/globals.css | 5 +- styles/templates/default/css/normalize.css | 1 + styles/templates/default/css/top.css | 2 +- styles/templates/default/usercp_register.tpl | 2 +- styles/templates/default/viewtopic_attach.tpl | 7 ++- tracker.php | 2 +- viewforum.php | 2 +- 295 files changed, 130 insertions(+), 101 deletions(-) rename styles/images/clients/{Ttorrent.png => tTorrent.png} (100%) rename styles/images/flags/{AD.SVG => AD.svg} (100%) rename styles/images/flags/{AE.SVG => AE.svg} (100%) rename styles/images/flags/{AF.SVG => AF.svg} (100%) rename styles/images/flags/{AG.SVG => AG.svg} (100%) rename styles/images/flags/{AI.SVG => AI.svg} (100%) rename styles/images/flags/{AL.SVG => AL.svg} (100%) rename styles/images/flags/{AM.SVG => AM.svg} (100%) rename styles/images/flags/{AO.SVG => AO.svg} (100%) rename styles/images/flags/{AQ.SVG => AQ.svg} (100%) rename styles/images/flags/{AR.SVG => AR.svg} (100%) rename styles/images/flags/{ARAB.SVG => ARAB.svg} (100%) rename styles/images/flags/{AS.SVG => AS.svg} (100%) rename styles/images/flags/{AT.SVG => AT.svg} (100%) rename styles/images/flags/{AU.SVG => AU.svg} (100%) rename styles/images/flags/{AW.SVG => AW.svg} (100%) rename styles/images/flags/{AX.SVG => AX.svg} (100%) rename styles/images/flags/{AZ.SVG => AZ.svg} (100%) rename styles/images/flags/{BA.SVG => BA.svg} (100%) rename styles/images/flags/{BB.SVG => BB.svg} (100%) rename styles/images/flags/{BD.SVG => BD.svg} (100%) rename styles/images/flags/{BE.SVG => BE.svg} (100%) rename styles/images/flags/{BF.SVG => BF.svg} (100%) rename styles/images/flags/{BG.SVG => BG.svg} (100%) rename styles/images/flags/{BH.SVG => BH.svg} (100%) rename styles/images/flags/{BI.SVG => BI.svg} (100%) rename styles/images/flags/{BJ.SVG => BJ.svg} (100%) rename styles/images/flags/{BL.SVG => BL.svg} (100%) rename styles/images/flags/{BM.SVG => BM.svg} (100%) rename styles/images/flags/{BN.SVG => BN.svg} (100%) rename styles/images/flags/{BO.SVG => BO.svg} (100%) rename styles/images/flags/{BQ.SVG => BQ.svg} (100%) rename styles/images/flags/{BR.SVG => BR.svg} (100%) rename styles/images/flags/{BS.SVG => BS.svg} (100%) rename styles/images/flags/{BT.SVG => BT.svg} (100%) rename styles/images/flags/{BV.SVG => BV.svg} (100%) rename styles/images/flags/{BW.SVG => BW.svg} (100%) rename styles/images/flags/{BY.SVG => BY.svg} (100%) rename styles/images/flags/{BZ.SVG => BZ.svg} (100%) rename styles/images/flags/{CA.SVG => CA.svg} (100%) rename styles/images/flags/{CC.SVG => CC.svg} (100%) rename styles/images/flags/{CD.SVG => CD.svg} (100%) rename styles/images/flags/{CEFTA.SVG => CEFTA.svg} (100%) rename styles/images/flags/{CF.SVG => CF.svg} (100%) rename styles/images/flags/{CG.SVG => CG.svg} (100%) rename styles/images/flags/{CH.SVG => CH.svg} (100%) rename styles/images/flags/{CI.SVG => CI.svg} (100%) rename styles/images/flags/{CK.SVG => CK.svg} (100%) rename styles/images/flags/{CL.SVG => CL.svg} (100%) rename styles/images/flags/{CM.SVG => CM.svg} (100%) rename styles/images/flags/{CN.SVG => CN.svg} (100%) rename styles/images/flags/{CO.SVG => CO.svg} (100%) rename styles/images/flags/{CP.SVG => CP.svg} (100%) rename styles/images/flags/{CR.SVG => CR.svg} (100%) rename styles/images/flags/{CU.SVG => CU.svg} (100%) rename styles/images/flags/{CV.SVG => CV.svg} (100%) rename styles/images/flags/{CW.SVG => CW.svg} (100%) rename styles/images/flags/{CX.SVG => CX.svg} (100%) rename styles/images/flags/{CY.SVG => CY.svg} (100%) rename styles/images/flags/{CZ.SVG => CZ.svg} (100%) rename styles/images/flags/{DE.SVG => DE.svg} (100%) rename styles/images/flags/{DG.SVG => DG.svg} (100%) rename styles/images/flags/{DJ.SVG => DJ.svg} (100%) rename styles/images/flags/{DK.SVG => DK.svg} (100%) rename styles/images/flags/{DM.SVG => DM.svg} (100%) rename styles/images/flags/{DO.SVG => DO.svg} (100%) rename styles/images/flags/{DZ.SVG => DZ.svg} (100%) rename styles/images/flags/{EAC.SVG => EAC.svg} (100%) rename styles/images/flags/{EC.SVG => EC.svg} (100%) rename styles/images/flags/{EE.SVG => EE.svg} (100%) rename styles/images/flags/{EG.SVG => EG.svg} (100%) rename styles/images/flags/{EH.SVG => EH.svg} (100%) rename styles/images/flags/{ER.SVG => ER.svg} (100%) rename styles/images/flags/{ES-CT.SVG => ES-CT.svg} (100%) rename styles/images/flags/{ES-GA.SVG => ES-GA.svg} (100%) rename styles/images/flags/{ES-PV.SVG => ES-PV.svg} (100%) rename styles/images/flags/{ES.SVG => ES.svg} (100%) rename styles/images/flags/{ET.SVG => ET.svg} (100%) rename styles/images/flags/{EU.SVG => EU.svg} (100%) rename styles/images/flags/{FI.SVG => FI.svg} (100%) rename styles/images/flags/{FJ.SVG => FJ.svg} (100%) rename styles/images/flags/{FK.SVG => FK.svg} (100%) rename styles/images/flags/{FM.SVG => FM.svg} (100%) rename styles/images/flags/{FO.SVG => FO.svg} (100%) rename styles/images/flags/{FR.SVG => FR.svg} (100%) rename styles/images/flags/{GA.SVG => GA.svg} (100%) rename styles/images/flags/{GB-ENG.SVG => GB-ENG.svg} (100%) rename styles/images/flags/{GB-NIR.SVG => GB-NIR.svg} (100%) rename styles/images/flags/{GB-SCT.SVG => GB-SCT.svg} (100%) rename styles/images/flags/{GB-WLS.SVG => GB-WLS.svg} (100%) rename styles/images/flags/{GB.SVG => GB.svg} (100%) rename styles/images/flags/{GD.SVG => GD.svg} (100%) rename styles/images/flags/{GE.SVG => GE.svg} (100%) rename styles/images/flags/{GF.SVG => GF.svg} (100%) rename styles/images/flags/{GG.SVG => GG.svg} (100%) rename styles/images/flags/{GH.SVG => GH.svg} (100%) rename styles/images/flags/{GI.SVG => GI.svg} (100%) rename styles/images/flags/{GL.SVG => GL.svg} (100%) rename styles/images/flags/{GM.SVG => GM.svg} (100%) rename styles/images/flags/{GN.SVG => GN.svg} (100%) rename styles/images/flags/{GP.SVG => GP.svg} (100%) rename styles/images/flags/{GQ.SVG => GQ.svg} (100%) rename styles/images/flags/{GR.SVG => GR.svg} (100%) create mode 100644 styles/images/flags/GR3.svg rename styles/images/flags/{GS.SVG => GS.svg} (100%) rename styles/images/flags/{GT.SVG => GT.svg} (100%) rename styles/images/flags/{GU.SVG => GU.svg} (100%) rename styles/images/flags/{GW.SVG => GW.svg} (100%) rename styles/images/flags/{GY.SVG => GY.svg} (100%) rename styles/images/flags/{HK.SVG => HK.svg} (100%) rename styles/images/flags/{HM.SVG => HM.svg} (100%) rename styles/images/flags/{HN.SVG => HN.svg} (100%) rename styles/images/flags/{HR.SVG => HR.svg} (100%) rename styles/images/flags/{HT.SVG => HT.svg} (100%) rename styles/images/flags/{HU.SVG => HU.svg} (100%) rename styles/images/flags/{IC.SVG => IC.svg} (100%) rename styles/images/flags/{ID.SVG => ID.svg} (100%) rename styles/images/flags/{IE.SVG => IE.svg} (100%) rename styles/images/flags/{IL.SVG => IL.svg} (100%) rename styles/images/flags/{IM.SVG => IM.svg} (100%) rename styles/images/flags/{IN.SVG => IN.svg} (100%) rename styles/images/flags/{IO.SVG => IO.svg} (100%) rename styles/images/flags/{IQ.SVG => IQ.svg} (100%) rename styles/images/flags/{IR.SVG => IR.svg} (100%) rename styles/images/flags/{IS.SVG => IS.svg} (100%) rename styles/images/flags/{IT.SVG => IT.svg} (100%) rename styles/images/flags/{JE.SVG => JE.svg} (100%) rename styles/images/flags/{JM.SVG => JM.svg} (100%) rename styles/images/flags/{JO.SVG => JO.svg} (100%) rename styles/images/flags/{JP.SVG => JP.svg} (100%) rename styles/images/flags/{KE.SVG => KE.svg} (100%) rename styles/images/flags/{KG.SVG => KG.svg} (100%) rename styles/images/flags/{KH.SVG => KH.svg} (100%) rename styles/images/flags/{KI.SVG => KI.svg} (100%) rename styles/images/flags/{KM.SVG => KM.svg} (100%) rename styles/images/flags/{KN.SVG => KN.svg} (100%) rename styles/images/flags/{KP.SVG => KP.svg} (100%) rename styles/images/flags/{KR.SVG => KR.svg} (100%) rename styles/images/flags/{KW.SVG => KW.svg} (100%) rename styles/images/flags/{KY.SVG => KY.svg} (100%) rename styles/images/flags/{KZ.SVG => KZ.svg} (100%) rename styles/images/flags/{LA.SVG => LA.svg} (100%) rename styles/images/flags/{LB.SVG => LB.svg} (100%) rename styles/images/flags/{LC.SVG => LC.svg} (100%) rename styles/images/flags/{LI.SVG => LI.svg} (100%) rename styles/images/flags/{LK.SVG => LK.svg} (100%) rename styles/images/flags/{LR.SVG => LR.svg} (100%) rename styles/images/flags/{LS.SVG => LS.svg} (100%) rename styles/images/flags/{LT.SVG => LT.svg} (100%) rename styles/images/flags/{LU.SVG => LU.svg} (100%) rename styles/images/flags/{LV.SVG => LV.svg} (100%) rename styles/images/flags/{LY.SVG => LY.svg} (100%) rename styles/images/flags/{MA.SVG => MA.svg} (100%) rename styles/images/flags/{MC.SVG => MC.svg} (100%) rename styles/images/flags/{MD.SVG => MD.svg} (100%) rename styles/images/flags/{ME.SVG => ME.svg} (100%) rename styles/images/flags/{MF.SVG => MF.svg} (100%) rename styles/images/flags/{MG.SVG => MG.svg} (100%) rename styles/images/flags/{MH.SVG => MH.svg} (100%) rename styles/images/flags/{MK.SVG => MK.svg} (100%) rename styles/images/flags/{ML.SVG => ML.svg} (100%) rename styles/images/flags/{MM.SVG => MM.svg} (100%) rename styles/images/flags/{MN.SVG => MN.svg} (100%) rename styles/images/flags/{MO.SVG => MO.svg} (100%) rename styles/images/flags/{MP.SVG => MP.svg} (100%) rename styles/images/flags/{MQ.SVG => MQ.svg} (100%) rename styles/images/flags/{MR.SVG => MR.svg} (100%) rename styles/images/flags/{MS.SVG => MS.svg} (100%) rename styles/images/flags/{MT.SVG => MT.svg} (100%) rename styles/images/flags/{MU.SVG => MU.svg} (100%) rename styles/images/flags/{MV.SVG => MV.svg} (100%) rename styles/images/flags/{MW.SVG => MW.svg} (100%) rename styles/images/flags/{MX.SVG => MX.svg} (100%) rename styles/images/flags/{MY.SVG => MY.svg} (100%) rename styles/images/flags/{MZ.SVG => MZ.svg} (100%) rename styles/images/flags/{NA.SVG => NA.svg} (100%) rename styles/images/flags/{NC.SVG => NC.svg} (100%) rename styles/images/flags/{NE.SVG => NE.svg} (100%) rename styles/images/flags/{NF.SVG => NF.svg} (100%) rename styles/images/flags/{NG.SVG => NG.svg} (100%) rename styles/images/flags/{NI.SVG => NI.svg} (100%) rename styles/images/flags/{NL.SVG => NL.svg} (100%) rename styles/images/flags/{NO.SVG => NO.svg} (100%) rename styles/images/flags/{NP.SVG => NP.svg} (100%) rename styles/images/flags/{NR.SVG => NR.svg} (100%) rename styles/images/flags/{NU.SVG => NU.svg} (100%) rename styles/images/flags/{NZ.SVG => NZ.svg} (100%) rename styles/images/flags/{OM.SVG => OM.svg} (100%) rename styles/images/flags/{PA.SVG => PA.svg} (100%) rename styles/images/flags/{PC.SVG => PC.svg} (100%) rename styles/images/flags/{PE.SVG => PE.svg} (100%) rename styles/images/flags/{PF.SVG => PF.svg} (100%) rename styles/images/flags/{PG.SVG => PG.svg} (100%) rename styles/images/flags/{PH.SVG => PH.svg} (100%) rename styles/images/flags/{PK.SVG => PK.svg} (100%) rename styles/images/flags/{PL.SVG => PL.svg} (100%) rename styles/images/flags/{PM.SVG => PM.svg} (100%) rename styles/images/flags/{PN.SVG => PN.svg} (100%) rename styles/images/flags/{PR.SVG => PR.svg} (100%) rename styles/images/flags/{PS.SVG => PS.svg} (100%) rename styles/images/flags/{PT.SVG => PT.svg} (100%) rename styles/images/flags/{PW.SVG => PW.svg} (100%) rename styles/images/flags/{PY.SVG => PY.svg} (100%) rename styles/images/flags/{QA.SVG => QA.svg} (100%) rename styles/images/flags/{RE.SVG => RE.svg} (100%) rename styles/images/flags/{RO.SVG => RO.svg} (100%) rename styles/images/flags/{RS.SVG => RS.svg} (100%) rename styles/images/flags/{RU.SVG => RU.svg} (100%) rename styles/images/flags/{RW.SVG => RW.svg} (100%) rename styles/images/flags/{SA.SVG => SA.svg} (100%) rename styles/images/flags/{SB.SVG => SB.svg} (100%) rename styles/images/flags/{SC.SVG => SC.svg} (100%) rename styles/images/flags/{SD.SVG => SD.svg} (100%) rename styles/images/flags/{SE.SVG => SE.svg} (100%) rename styles/images/flags/{SG.SVG => SG.svg} (100%) rename styles/images/flags/{SH-AC.SVG => SH-AC.svg} (100%) rename styles/images/flags/{SH-HL.SVG => SH-HL.svg} (100%) rename styles/images/flags/{SH-TA.SVG => SH-TA.svg} (100%) rename styles/images/flags/{SH.SVG => SH.svg} (100%) rename styles/images/flags/{SI.SVG => SI.svg} (100%) rename styles/images/flags/{SJ.SVG => SJ.svg} (100%) rename styles/images/flags/{SK.SVG => SK.svg} (100%) rename styles/images/flags/{SL.SVG => SL.svg} (100%) rename styles/images/flags/{SM.SVG => SM.svg} (100%) rename styles/images/flags/{SN.SVG => SN.svg} (100%) rename styles/images/flags/{SO.SVG => SO.svg} (100%) rename styles/images/flags/{SR.SVG => SR.svg} (100%) rename styles/images/flags/{SS.SVG => SS.svg} (100%) rename styles/images/flags/{ST.SVG => ST.svg} (100%) rename styles/images/flags/{SU.SVG => SU.svg} (100%) rename styles/images/flags/{SV.SVG => SV.svg} (100%) rename styles/images/flags/{SX.SVG => SX.svg} (100%) rename styles/images/flags/{SY.SVG => SY.svg} (100%) rename styles/images/flags/{SZ.SVG => SZ.svg} (100%) rename styles/images/flags/{TC.SVG => TC.svg} (100%) rename styles/images/flags/{TD.SVG => TD.svg} (100%) rename styles/images/flags/{TF.SVG => TF.svg} (100%) rename styles/images/flags/{TG.SVG => TG.svg} (100%) rename styles/images/flags/{TH.SVG => TH.svg} (100%) rename styles/images/flags/{TJ.SVG => TJ.svg} (100%) rename styles/images/flags/{TK.SVG => TK.svg} (100%) rename styles/images/flags/{TL.SVG => TL.svg} (100%) rename styles/images/flags/{TM.SVG => TM.svg} (100%) rename styles/images/flags/{TN.SVG => TN.svg} (100%) rename styles/images/flags/{TO.SVG => TO.svg} (100%) rename styles/images/flags/{TR.SVG => TR.svg} (100%) rename styles/images/flags/{TT.SVG => TT.svg} (100%) rename styles/images/flags/{TV.SVG => TV.svg} (100%) rename styles/images/flags/{TW.SVG => TW.svg} (100%) rename styles/images/flags/{TZ.SVG => TZ.svg} (100%) rename styles/images/flags/{UA.SVG => UA.svg} (100%) rename styles/images/flags/{UG.SVG => UG.svg} (100%) rename styles/images/flags/{UM.SVG => UM.svg} (100%) rename styles/images/flags/{UN.SVG => UN.svg} (100%) rename styles/images/flags/{US.SVG => US.svg} (100%) rename styles/images/flags/{UY.SVG => UY.svg} (100%) rename styles/images/flags/{UZ.SVG => UZ.svg} (100%) rename styles/images/flags/{VA.SVG => VA.svg} (100%) rename styles/images/flags/{VC.SVG => VC.svg} (100%) rename styles/images/flags/{VE.SVG => VE.svg} (100%) rename styles/images/flags/{VG.SVG => VG.svg} (100%) rename styles/images/flags/{VI.SVG => VI.svg} (100%) rename styles/images/flags/{VN.SVG => VN.svg} (100%) rename styles/images/flags/{VU.SVG => VU.svg} (100%) rename styles/images/flags/{WF.SVG => WF.svg} (100%) rename styles/images/flags/{WS.SVG => WS.svg} (100%) rename styles/images/flags/{XK.SVG => XK.svg} (100%) rename styles/images/flags/{XX.SVG => XX.svg} (100%) rename styles/images/flags/{YE.SVG => YE.svg} (100%) rename styles/images/flags/{YT.SVG => YT.svg} (100%) rename styles/images/flags/{ZA.SVG => ZA.svg} (100%) rename styles/images/flags/{ZM.SVG => ZM.svg} (100%) rename styles/images/flags/{ZW.SVG => ZW.svg} (100%) create mode 100644 styles/images/flags/gg.bat create mode 100644 styles/images/t_info.png diff --git a/bt/announce.php b/bt/announce.php index 4a6c48415..29a2f4001 100644 --- a/bt/announce.php +++ b/bt/announce.php @@ -82,7 +82,7 @@ if (!isset($info_hash)) { $info_hash_hex = bin2hex($info_hash); // Store peer id -$peer_id_sql = rtrim(DB()->escape(preg_replace('/[^a-zA-Z0-9\-\_]/', '', $peer_id)), ' '); +$peer_id_sql = preg_replace('/[^a-zA-Z0-9\-\_]/', '', $peer_id); // Check info_hash length if (strlen($info_hash) !== 20) { @@ -108,17 +108,15 @@ if (!isset($left) || $left < 0) { // IP $ip = $_SERVER['REMOTE_ADDR']; +// 'ip' query handling if (!$bb_cfg['ignore_reported_ip'] && isset($_GET['ip']) && $ip !== $_GET['ip']) { - if (!$bb_cfg['verify_reported_ip']) { - $ip = $_GET['ip']; - } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) { - foreach ($matches[0] as $x_ip) { - if ($x_ip === $_GET['ip']) { - if (!$bb_cfg['allow_internal_ip'] && preg_match("#(127\.([0-9]{1,3}\.){2}[0-9]{1,3}|10\.([0-9]{1,3}\.){2}[0-9]{1,3}|172\.[123][0-9]\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3})#", $x_ip)) { - break; - } - $ip = $x_ip; - break; + if (!$bb_cfg['verify_reported_ip'] && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $x_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + + if ($x_ip === $_GET['ip']) { + $filteredIp = filter_var($x_ip, FILTER_VALIDATE_IP); + if ($filteredIp !== false && ($bb_cfg['allow_internal_ip'] || !filter_var($filteredIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))) { + $ip = $filteredIp; } } } @@ -216,7 +214,12 @@ if ($lp_info) { // Check hybrid status if (!empty($row['info_hash']) && !empty($row['info_hash_v2'])) { - if ($info_hash !== $row['info_hash']) { // Change this to substr($row['info_hash_v2'], 0, 20) in the future for updating statistics, in case of v2 torrents being prioritized. + $stat_protocol = match($bb_cfg['tracker']['hybrid_stat_protocol']) { + 1 => $row['info_hash'], + 2 => substr($row['info_hash_v2'], 0, 20), + default => $row['info_hash'] + }; + if ($info_hash !== $stat_protocol) { $hybrid_unrecord = true; // This allows us to announce only for one info-hash } } @@ -450,7 +453,6 @@ if (!$output) { $output = [ 'interval' => (int)$announce_interval, - 'min interval' => (int)$announce_interval, 'complete' => (int)$seeders, 'incomplete' => (int)$leechers, 'downloaded' => (int)$client_completed, diff --git a/common.php b/common.php index 3ba700bd2..a60d45e00 100644 --- a/common.php +++ b/common.php @@ -44,7 +44,7 @@ date_default_timezone_set('UTC'); // Set remote address $allowedCDNs = ['HTTP_X_FORWARDED_FOR', 'HTTP_FASTLY_CLIENT_IP', 'HTTP_CF_CONNECTING_IP']; foreach ($allowedCDNs as $allowedCDN) { - if (isset($_SERVER[$allowedCDN]) && filter_var($_SERVER[$allowedCDN], FILTER_VALIDATE_IP)) { + if (isset($_SERVER[$allowedCDN]) && filter_var($_SERVER[$allowedCDN], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { $_SERVER['REMOTE_ADDR'] = $_SERVER[$allowedCDN]; } } diff --git a/composer.json b/composer.json index aa8c85a5d..2e678e70c 100644 --- a/composer.json +++ b/composer.json @@ -47,6 +47,7 @@ "ext-xml": "*", "ext-xmlwriter": "*", "arokettu/bencode": "^4.1.0", + "arokettu/torrent-file": "^5.2.1", "bugsnag/bugsnag": "^v3.29.1", "claviska/simpleimage": "^4.0", "egulias/email-validator": "^4.0.1", diff --git a/filelist.php b/filelist.php index 90697d7e6..9ae8bff4c 100644 --- a/filelist.php +++ b/filelist.php @@ -35,9 +35,10 @@ if (empty($row) || empty($row['physical_filename'])) { bb_simple_die($lang['INVALID_TOPIC_ID_DB'], 404); } -if (empty($row['info_hash_v2'])) { - bb_simple_die($lang['BT_V2_FLIST_ONLY'], 410); -} +// Method fields +$t_version_field = !empty($row['info_hash_v2']) ? 'v2' : 'v1'; +$t_files_field = ($t_version_field === 'v2') ? 'getFileTree' : 'getFiles'; +$t_hash_field = ($t_version_field === 'v2') ? 'piecesRoot' : 'sha1'; $file_path = get_attachments_dir() . '/' . $row['physical_filename']; @@ -48,32 +49,44 @@ if (!is_file($file_path)) { $file_contents = file_get_contents($file_path); if ($bb_cfg['flist_max_files']) { - $filetree_pos = strpos($file_contents, '9:file tree'); + $filetree_pos = !empty($row['info_hash_v2']) ? strpos($file_contents, '9:file tree') : false; $files_pos = !empty($row['info_hash']) ? strpos($file_contents, '5:files', $filetree_pos) : false; - $file_count = substr_count($file_contents, '6:length', $filetree_pos, ($files_pos ? ($files_pos - $filetree_pos) : null)); + + if ($filetree_pos) { + $file_count = substr_count($file_contents, '6:length', $filetree_pos, ($files_pos ? ($files_pos - $filetree_pos) : null)); + } + else { + $file_count = substr_count($file_contents, '6:length', $files_pos); + } if ($file_count > $bb_cfg['flist_max_files']) { - bb_simple_die(sprintf($lang['BT_V2_FLIST_LIMIT'], $bb_cfg['flist_max_files'], $file_count), 410); + bb_simple_die(sprintf($lang['BT_FLIST_LIMIT'], $bb_cfg['flist_max_files'], $file_count), 410); } } try { - $torrent = \Arokettu\Bencode\Bencode::decode($file_contents, dictType: \Arokettu\Bencode\Bencode\Collection::ARRAY); + $torrent = \Arokettu\Torrent\TorrentFile::loadFromString($file_contents); } catch (\Exception $e) { bb_simple_die(htmlCHR("{$lang['TORFILE_INVALID']}: {$e->getMessage()}"), 410); } -if (isset($torrent['info']['private']) && IS_GUEST) { +if ($torrent->isPrivate() && IS_GUEST) { bb_simple_die($lang['BT_PRIVATE_TORRENT'], 403); } -$files = (new TorrentPier\Legacy\TorrentFileList($torrent))->fileTreeTable($torrent['info']['file tree']); +$files = $torrent->$t_version_field()->$t_files_field(); + +$allFiles = ''; +foreach ($files as $file) { + $allFiles .= '
Path ({$files['count']} files) | +Path ({$data['file_count']} files) | Size | BTMR hash @@ -186,15 +199,12 @@ sup { |
---|
Generated by TorrentPier