From 2a0103c05c4011706bc59251a36b23e1c15dd949 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Wed, 13 Aug 2025 23:10:35 +0200 Subject: [PATCH] fix support for IPinfo's databases --- CHANGELOG.md | 1 + resources/test/ipinfo_asn_sample.mmdb | Bin 24042 -> 24334 bytes resources/test/ipinfo_country_asn_sample.mmdb | Bin 35365 -> 0 bytes resources/test/ipinfo_country_sample.mmdb | Bin 30313 -> 0 bytes resources/test/ipinfo_lite_sample.mmdb | Bin 0 -> 6885 bytes resources/test/ipinfo_location_sample.mmdb | Bin 0 -> 8780 bytes src/mmdb/asn.rs | 44 +++++++++--------- src/mmdb/country.rs | 36 +++++++------- src/mmdb/types/mmdb_country_entry.rs | 6 ++- 9 files changed, 43 insertions(+), 44 deletions(-) delete mode 100644 resources/test/ipinfo_country_asn_sample.mmdb delete mode 100644 resources/test/ipinfo_country_sample.mmdb create mode 100644 resources/test/ipinfo_lite_sample.mmdb create mode 100644 resources/test/ipinfo_location_sample.mmdb diff --git a/CHANGELOG.md b/CHANGELOG.md index bfaabc36..a1ab69aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ## [UNRELEASED] - Simplified Chinese ([#838](https://github.com/GyulyVGC/sniffnet/pull/838)) - Japanese ([#849](https://github.com/GyulyVGC/sniffnet/pull/849)) - French ([#864](https://github.com/GyulyVGC/sniffnet/pull/864)) +- Fix support for IPinfo's databases (the most recent version renamed the `country` field to `country_code`) ## [1.4.0] - 2025-06-27 - Import PCAP files ([#795](https://github.com/GyulyVGC/sniffnet/pull/795) — fixes [#283](https://github.com/GyulyVGC/sniffnet/issues/283)) diff --git a/resources/test/ipinfo_asn_sample.mmdb b/resources/test/ipinfo_asn_sample.mmdb index 6e86ae38d0d3320b05b911135632a24b19d2830b..b1e36399b8466bf75c671ae057c5d4811b820bec 100644 GIT binary patch literal 24334 zcma)?1$Y}r_w{88G;x@rT_;VNwy`Rf<)X}rF{Z>x-E=LOSlwp=pLW-B-dem?yIauhk5 z97B#JHzCK7z9sSxHur)npABBA1c1WF1*gHjs^E6SvW;vfSCA{o4ssQ_n%tS} zBzGa#kh_wm&6bBgwsm1CU~Fw+lq*ppC}LeiQHGh@4ZBC#a?SKok3nCn>3!7up$}+! z9DahaK~3KcdQ$UK%t=EZ%Ic#}p}vk>kN8M7Zreb8cj$Z2-cyV3MQv|#ALQ*zdp~l2 zMfv*R?>KM4N8%sYhom-G+S@(x4Z;V5UI9HHq)!as`nM{D{q)Q&~`INHZ+@e`n* zNc|-8WG#+dDPBF-UXU|A^eLp|6=%; zX#S<}FVpALtYE*I@;I6egNeL`Zp@d_T5D7X2fsN z^joRl2K{zTzk~Xn(C^apyW!u1av$UODvo&u+WlEu+*987LGmH;Ve%33QC#;J?Z*}6 zbx%-x67i>KKdr@aKbiNe;@J80pGW=+THcHBUqbm1T6Uj+7+a|5JW->X2oT@16oUUCz1GzJK?JP~7 z4Sf#EBF5&D^GMF8oK5L(hFk;pz*>~|C?Xd?U#RJuD_!J?lCxNgEy0ng1lpD;r=e_x z(u=aSx<=N!6n-(vN)$WFGL&t2F9+=HQJnN$q+7e*gSeNvkMwJC++W@&fV@)L+mhR5 z^TvsB*@60wgtPc8E5G`}8xgXTBFZ_<2T zo6`)vMd>-17qYH4Ew3H%70MrXsit=@cNOBRY45DXJE8AFeT}B?3fIVO zznih1tUm55=rNQL#@52_qurm)%Nd{+ClkmU)Z)8QPm(Fb)3k@kVR9Y0UQzVXcrpGP zvVP9)@b_Tep0JOmy%+4gY44-u?@Mhza)0Ckv z&f$z5p(wQ@q4U~I9mg>5SVcMJ$06@{>L-vVYVnh(olKrWo~k(hC0u_x%KIp1pxlje zCdySPXEFC|MR~t-pr1?qJo0?<0`fxgBJyJL5>lU!mr=W%yaM%KsqDfcYFCrjkk^ve zDav+TkLzyG{2Q5b6L~Y@w`lQO;orvC?V5fE^gA{GE}N}TUmy1%elN zQ~QJbll)5&&9~*|D0@PRTAre)KR2IR0XYiVXe~a5`dD%kavbu;(=H?@D9U;#Qk!J6 zO~4!$n$)L|Q^{$lXSx=jL479lS+r+s@j1}vqHvAn&VxOld7El^n^7|qC*pU>`!66D z;=0Y1E%in47c;g+R-af&ZA-*CRx*EU>PyLD(vG}sXgd^TzLS~@aW`#`7WY!~k$%OA z$00v}g7utRigGIB+mhQs+a9H!{tmErq`eavB+JNhvO-a|&-$HJxV~D`Yv6}8e;NE* z<>%IA^@&*bxeX}mP#RHoW=<3A<=MR4X80|d-wMA?^V{LC;I%8s4ssQ_T5*y!#+|rk zEy^xRm%nEXb9W_8#JjY3n0f?yRMWeu_mI7a$FlKB_?P?ULt$lHy2 zQqxn=)6|DFeb{E3^gQ+T$T<*YM2l~Lzq{t|!Q4H`y~w?hw~v;$FZ}%&+n+oj8=uVi zmU|HL4$kVihrq|$%{>O?P)$D!{^6Q`gtBvwB#%P;Xk|~<^Nxj%IW77|_RsO~PoRAw zd6E`C8Szt;Kly#ePa{u9>Y5i zUP@kuyvuF2DeO0kxmQBJiaA%4*O1qe*OAwgH;^|f%KP3#?Pk<>3+-EB-$DB}@^-~3 z828*ev$m|`ZfJj^+=KEe%DueiKJtD=nfn0Z528HF*hA#Q&>o@vsFwd2wZ{>E0{y@~ z%Y735Q=0!Y^PW-6&IzRH`ESC1i+OLu z{u<>S`tNFa??Jcb(+99WL;28Vo7%(NkI0Xqf1>H1DqZA>lKVON1?(@gvD~k;YrbJ! z-zv&>e@E?mT=xU*AIYDf{Yv|1@)yOaVm|yv?RWBzY)sbu7ru9HiegiGUJmTZD7o|z z5P5m|iqbBiHi{fgjv>dAo8Y=}w8tyT>kFYzpgxhDq&RI6{V9qve=4T{sawb`Z}3(ixN@%bt)_05zmb%WOxkqdC$LM^^Ie5-wnnX`o!UxN6Sn!gqN ztx+7zT}l>{cEq+pyD+E3{RKtIbE3GiTAmxeC+o|$`tTZd8UX&7)5bF()rR27V zZKrH`?e^4nAa_K3CoLX?U#9ux@GF>Gsp(bJsu8cr>eI#jmZ5Z_)MoX(I_B3yZ_xBc z_)Uy0*Ysv;Eo3X%hWvKgE69~(2f0d7{@&HpcDC83AFk=Upq@31?Mj+jyo*{Gc@a&I zQtyV2buI2O{S9g{Xb+*RMcEytPwBE9{mdDF9@q2)^+9qsGKsvDmY1eJL=Kbdkhh-p zh@!mT24&B{nC0z(awf{2C`Y2~rRD9-Yxg1dMSMRkzCZi}7&}nY4}yL$^+QPXg}nEn zTHayE)BF7h6`LX2a}@KB*7A>`hIK3JI*vRZ`6p<3CsIEN`pL9UAy3uvPDA{3%|F9t zoAEyL&O+>Jl(Xrdqvf3o{XES-pE(zh7b1R<7QdMKCFG@uU#7(`r+x)_C3%(2Hgjt& z?;2cpt>$0Hyz9vu5WkW3P2|nc?xcMSc`LNrP`5R&ZijzI))#u-UCg~(QEK-oh+Hd=uq!=DY>_Z7uH|>hF^8k(e`iAJG1g{76yO z|1q^s$WO`76lXbc{TI}}RFv0!1^sK3Ur@eb{9E!n@_X_J@<;L~@@GX+->d_u{Yw6Z zdVkNx^ZtPUCu4sp=Gzo!v7hsE(NB{Y%OjDLU!ZJppZrnON5dXNdn~yLIZjdLkEd3M z{0X!tD$bs(isny+KaKg*$r)OFCgQWG&nD-PdcE_IH$Qvb>{akLW1fNk&!HB6 z5enu`{sNR!P!^)BLD?Lo3}q4X7sK|TY>}-me+gq-l3S5mBX6meS4`bbZiBdkHs*-z zE0?0Q-O8SQDe}CG`$)f*S3)g7mLh*!+S`%aE6RFzKzv8d-wA#&>(9X$=9i;1qf}(| z{7U#$%FnMRYqWTX+A*}?<2KbGPHEH^CWzWI*$m?3jR^+#7dF|9!kSoa! z9>1pUg)Q2^F9kum{k7)V^>bpbVBdgC9b9XPs_Ri}0 z`#|59`hJ?eKlB4M|3Ky(L>^2Yf;{x6=u=VVvX1=27(bjmf;3vf|w5=%0$5OHoc!zO4Ur#xUN}Ka)HQd1uo;M^VPlg?=9O^ELef zY8R3hA@5?^mt^ziZ3X=@l-n4)oVuK^arUw1pQ%6e}wv@iu0bQ z|2XoVp#3EI6!|pyjH3Mg&my1WDSgzF{{r(~)bd_}{<7x3VzbSk!o1h8uWyO?>nNY0 zyg~g^$#@tL+Bq-|5(#Mf&OXMpN}=0|2f(*2mAu%50o#n z@%*n?$JgXHh<{7_J1y^f=s!^ZQPY2-_A~hl@_wcL8|>eeJs;yJiu_G~l7FFH<4|nM z7qNmIWf$aB;IFbuSY5r)NZPP8FjX@d9Yc^37x~NmuJ09^u+7rl$T6_|<$;jjQ z$?K-VpN2An@#%`2u7oy|+AMN*HkP^XT;$DDx~y+Lb2lY7BMq_$`3q<-BsW)-*DpeR zF?Id-EkQq=Lmg|spcG|m`b)`T(oSxpDC>0~->La7_-@Vj!1wYxpQih%m5>3&%`gT9 z+fv(3QQl{J=sQr~QPX#V9@P9Y_~p#2(DX`bRftz>dJX&#W6Nx|%@WEMET}{2L8)iF z0rt))joS51@Ru{*tm!S(TFEx#wQKPe)Wv-0puI|quSQ!Qq28(KyHHz0?n;`dr;B!2 zQTAJeS`_i_tZs;L>t!rPuFb{^`VjBe`~moJls!<`M+Jjgd^gsSL_DSGY3f7Jhfy}r zUq`MdM-+`qkh6Q%mcL<7=Ill8P3}YPOYWyAuh}2<96{C&$qkkIg z)0HjbXTU#G^Uq@5+0d=^d#)BgkMZ*nzkv3Ig{DAyWaY4PJywAtD?i0=b6#i$-|D61S z{8G#N3VB~s|Azcli+_js_tbwNeJWPMw4U6vE(L*&8IyM_ITQbit^eC)FvW6iS}f2ik3GO@oChj zYx)f6GpWxaXOnZtx#T>>gt@iu0JU`+knje5)%KU8=7oI|Ydo6DV zwbS z##%JJ6?$9N-<;QsS^<3}^E=2@p3gyW7ktk%yBt)n0C$GrHM_q~dRn)K6^lPYHi}-b#em(pfH2+5UH!=5S@)q(| z@;35z@(xA$JMW}+7kM}8yNC9@-T*^|5HWT-p_E|=bHZobH0TB745IJ_&3nMRsLeDE#EWm2l7Yq zC-P_V7xGs{dH>%~-|y7_Apg|jf6=yqIka=hJTjjwAV-my=c7l{9s`c0y$Lyv98VUK z6G(CWMB0Q6o6;8gW+(>A z_9#UtR{jFo3&G7beG%-%n!g3?CG@u>x6G~>OZGJ9XrC~9m{zR@z0N=FA$hP%V*vAY~TyT@U76lZN!QB|;|#Ni8| zo`G06nMftN)1p~MQCq#`8|8`QU?ORzV~IFwbD>RMx83PSZI&Hivuf~59Zp}sXB0Mu z6FvAP;r_%>MAfJ(MyR1&)P;IHPJ4+*)RnPS%PNB{PQS+}tV2c7cp5)XwX0mZXw<;K zP&^iv%@V)TU1E3n?M{bimt{ke-Bq-$QCL)N6csfa?$sjbb;&MKnbPrRe*!wo5pWrW zwP^oPI@X`E#}Y1YJa@p$b% zm)(itD9+m1(F>G#y+&bZAQ2e|+eM{CE9(;xqdt~OiGD6m;s#-}->9oYN3BK;P7j9B z=~LAyN9%T%FW_*X!nSaYa<&{QNsH{0?v{u$tmN(WLb*&Xa z)lR3s#O`*pVr6IA>GcKz4vc2+khv}z(?+v1uSQBnxfo%iC7K+Lg`-BqOq)g+;}uOB z?iHSZ-D7t;Wgke>?GSg=>_XUH#F&jq+0VhF45MCwe1* zMoUMI9;?RMaJjs0w7NDDGy7xlJ~eY%DwMbJd~WlhNp>{UQEXY6AMY&j1hB+vhhs_f zr>TaiGq0hw)u`@IbYXNF)LKo6h09eUM;}$8N7XOS+L?-7u7Fr`H5<$kPV0tMFpV-y zq;;`Kx)(z(TH{0=ZZYH;$C{?-KeyY9br$L$8i>aE3+tl8(SE~iG?_^Zfz@3;T;y8`QFva-%sT8t#>Tzug_M$7C&T} z=nJuQ5?FStOE3yz$G~q#Ep*T~nE`iu++H!@;gPOrvOCe=m$E0Z#Wj`-e@>4B4EH zl7L<8m$FA`>pkjpI|JCGtGlr4+554HHI~6LLQU4n5UmMdlKAXSm+YFXqgsPUhRf-2 z`~0Y-Z$mg~kK*U7s7;z{Q+=kfA(AwQ6X|$tsbShv=w?|Pev&gF#|gF3$^14iwg&vR z>S*79X^*9hqT0&Z`k)bNQJY6cKx`bCC*pd`wl-4CT3qhNvTEotHw-2d1DNf7vWJ&f zX9Z&kx_e7BhS$5~?x{JM#&}9xPK;R9KpH)aA68S}+G5BB;O+=uvU%KUs4d$XYuPI< zmm5E%L2RjEb6^lt#y-?%6g5>)$Ubd4ZB7RsHZF9BPwZs6m+5Aw*MW{kh27X+*O?nvDd2}ZQZ9Kjx#7P~NZd{Mn!)i3%*ZNpBF*hY0PJ4Rl=8&A%9oF+t%$XsQLpl>ElhQ`Ps~p&kZ@nGm=ZCxwN13OIapp>W7LHjT7xY{ zumugyR9V8uh^kU}+GgMk$b;mvkwm0FYVBt%=;mjg_DQ&maek>J_(~T{!MK<4huvx!hd3jB!A&4ncT!zsoYiz&@ zLWO=i9^hWF|Iv22H*TLxoHrXcu2OW#6j`73fLj*B&rc0y8{IOrp*JyPc&jsAh2F>A zN-%Tea#c2_lo}?{dTek;VRLU^x>%ml29vRrwWcOEm6xwDLiN}xu{xJXuWTrVWswqV zi>KdUI1FEGe@>kL(KF&OieHv>GB*pj#a7&y>g%#j4r&RswA5w~6WARxs}=iz(hTvmmN&BKj8A=FifKMJW>iVN*D!MMp6Hs#p<8>m`Y7CmGesicNky>iB1?yRKW$paos~^c+LdC|;P@89GR*7`KI~dJ{O>M1} z%|>-|V_OrCxgE|DuN{*U%O1ZnW2+x2=Dow^6{r4Y@&1_>n{*_aNDr$HZVtAK!@Bhf zx)e`TG3`-{IH|KjnAUbB>vKB2I2+bRhl|CLH*AlfeGSctczndDGrJPW7#0F{Jy8kP zj$Dwmt;r`=Pe7i-YVht7#T!>IPGUh}8o_EY>u`bWAnR&6*Af8Z^rE@blS>> zL^9H!Fj^8gR2y(a1m7*N^>m0z{8%4yR5P~r`yDvQ;$<_O#D-|fIkK!=+D3b0mFPmO z6!A>M9w?fWaWYMEy8Is0P=l!!Gwp-@7=Z?1$~l19Dpnd^0>zu3sz7=ARKRxY5ic9* zVR7)m*3sJ9UL)Rhaq_E4^hd;o)X*+w6pqu_?Nv=QGYxSE9CAXXW7vu9J;QbruPvSV z745CXI9NyH#qHQWlU>nRdMMsg+$yq+>Vd8r`6E4c@wowy64Aztqw2=P2|pj_j3)Jp zhf$4V4cOy&vudiYYb*=al{YptRF=2mbSBScs6m`dUF!Ln@vM0(r@t>CT8nRn$ylN| zWu|4*Z)Pm->4BCwiM#7#@XSD#vK~yVWxSSaes`c#<2X-+(mJed@i>9ON z!@csgR=j$(HKNvd=JhS}K}!sgXe#D4_BHYIEl;Z#Z!F?^u)r5`} zs*yQTh-o7Z|JJw3tdnV}+XquT_ROB4XdEvsVbdt8Xb#mcm*aug5S$or+z}1RIO=No z%<*|$V$a1B9UnJTJ37a$kRDbOPc#+cvq@qw^Q<(nw`7(Y<|O8(I$YuwbTYSa`SE6i z5!wlp$R=wPQ&a8Z_njlY;i)fe_2OO1h1reoIZpXHZ8_pgmK+#yx(T?%W;fUy>qj+g z@5Cm!vB5zcaIEi6w#T#uYeC%eNYIBc8KZ-tyB} z#<7--*zO(p3XRPsfe-HN#7Wrj@Ler9fJqp}`LI=eAl1JiZ`6ypi8$clC@P-k8OM6> z6(=Q!%a1qH(7G^w3-6M@0!KZ(+KEFRUS&2OChL2g_!uufm&xyO8OLfqI^5@TqvFO$ zEEN`qxbFVMI@FH|HdcKVU2Lp~CDDGI%9oVm-4{P6gtKHkf>Sw8?s6A!;gE+XClBWt z?{AY0i?u0j#@3nffkao#`n1+LuT^R|POQi0OzhL*HEgNqGc-dyG$>h*CZkC`>67BL zjn6sQC-7lIY!jA)?LRvYJPwCT96P$rB!)wL9c1@StWwH9j}E@Hi@!n)N391TX0Q0L zBu<<1xs&y*JxT5Xn08oHO@qnkKn%SpzDlV3EpJkiflV~pk5BsIby8O1$M;)t4$nB& zxMOtiwv4%Dz3q0+#yWPE;yZaMX1BYv6mv!QyYWxyKm14i5eE-yu|L%fi_aH>;!h3z z!x-m9?UrwZW9bn?&eGT*K4!xapA_(Ll4ryP*+lDnST0}d7GQ0wmiheQQl~3iVzn&e z|3jl>L(wvH8(v0m=rIc0%@{t!72`b}Gckqx+s&|Au{n5ASDKkJg0a*{Y{cv}TJWV9 z4=el?z-mCG+fnLtgdJ7`GX8%w0L#mRkL03jcEi`Mq;{UK+guN?A=hJ1;~!AO4WaCgqdjY>*O@Zc}?xvaZog@2q* z*4^aDxk|)e;P6D+iOn`kO-Hv+41mW$`~PaTtO#HBaF*Y=BDd+yR3z;GuZr-tg$2JP zzZjEy@yD}AR6E3lLjWT#}O^{`J?E42Ya8s_n%jn)g9=3uiGP@ zsV!-BDq}bE<+G_(9n7pxpW<9L4PO{srQK%0DSl_h{_h)MUnud*zk7RKBRy5;tZcA%hMW~VAy)mnNn7*Ef$5HBcs9xMy`0tzI4~*(VY;PBSoxGF$!(!(o z@%CL)#+8yt8F)d%gF^iEQGDDp!wI}8;i+UAcvZzA24e`0uQq9=^c6)0mF(F;} zf>44V-XJzbv_kF*;;);X9eioE8x@sCQ*&d5G(rtkjm`DJ)=+tnfAVAl{7#=o z46tZ`wEwRLh=uGd5wC&Ou?-ty_JQ@{i7bBVa7_NqR-Gr!Fh;`c$IGqwyAV2~+}du<~Z+GWz9KZ)Etf1O>4DX*fHsROfFB|xj(uF^9sMnLusV>vu z79;EzwP$R{zb;Yr404wQ+*lxuVlPja_>N|snOfQ_n_C)k*%yaJ%ZR{&n_&1l~*Q%Wzi0o13=(nb@T;IUS{u5;apb;lJ0R z*tXDD@~^9Ax<9&J{qd%;&m1Y{thA0uGhE_{VVYq%4Knt>wO;n(WlwxnZ?4A|7y17* ze6qR=r@Z9I8udA5&49T!kz6C6iHZ0*xqpww;@RlgwOvE8{>Yl>U?SX`pWA!dN2k_{ zEu+g!Mc1T92BRG@ocFsEMr?2m{uh!pDf|Hl$FqTfNLOtnnhGalgJQ+MQx=W?d*(7+ vY_(=o2nWQTA$-nD<>ce4W${ELx+a_$il^@#{lD5I)@w4dCKcNdJ;(TeGh5R@ literal 24042 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 BAYT9g diff --git a/resources/test/ipinfo_lite_sample.mmdb b/resources/test/ipinfo_lite_sample.mmdb new file mode 100644 index 0000000000000000000000000000000000000000..da15dab2e54429937a90fa05f61025cdc3f77bed GIT binary patch literal 6885 zcmb7|X>c4z6~|lFT2U+?vISX=Kw5@?0B56_*_C#c5WG@!tZuxLb2w%h&5m}*-kn)y zXJsi6?tsG)ZU_lS%ngBX->-S#2?j6Qh8)NJ&WE-)a7$I&ab`UQkb`mcq?jUv%cM^9IcN6yzyNP>=`-nZn zrx2e?yn+}dK8^Tv;xmZPBwk5;7V+7{tB9P~OWaR<4)M9ftBKDeKA+e}d;#%=#1|0{ z5U(M|h}RPPi3(9AYQ#7(K^!0s5|hLfafo;w@p|Hmi8l~mLOe)J6NiZ-#2bmD#4+MH zae|m3P7M3cBoED*(>DMBo2A0r+omWXAd4c-rNAa93MAg_YF0`hl=i>>$uunPVf^dPH{ z8ruH>SFlAzj-CKt1Nju>pJ=Z!)-LwI?VyO|D?!-Q{w~PlXy3tDWFPoy$eSVP8xgti zT2QR%b&xkgUXS+OAZ&$+cm$98);O8M< zfP5A5Al|`$?290Lx$~QN{u1QNcs>upwq1zhu1N^S-X-k(8U(S}EsXsJDApzVeGAXX zuiaQ1`!?h|ct+0b{vTs|kRN-{pM4K<76QANSjP__k3fD1`7z`)^u!zwG1lD){s;np zb`L_9A&65q=IK6%_dkLBl(D^0@MqvS1oQ00oO}O^cRz>x0`e$h`(ofPLE+0^fpIdpD-5mOdLabB2>Qhtt_{!>QSxyEd^<)UA?k=cnm~udpyNZkyf-$2~r+#QI~3 znvC^ds|=p!ZPTW08ctbQb*#dpQ=_tZAY&UbK7{F&q!N$wF+R^1d7c+WCw17!SBEF( z`N=6U)<9egmBdg7dGsJ3I=D`Gq-fbXlt*SsSyP2_s+lr>lCSng_{m8zs4!1epf*?V z%n}(`j_EZXogb$+eBOhvyu371OD6j@J~lpQn7VE0d~tYggcmaDTGey)5?-thrx$5( zVX&&Uv_Y7vYEYXsN=_}mT+&?=ZYslsk>JGv-td&BX$d~oYxBk4RbJ@51M9hqrtBAE z#am8^rEjKohOhEJk{4CE0^y#ET+TP>$!VLfbiJM;-7S_nr@Nl%TKYA}7Jsd`r4KEP z9?GQote-zsq^VnRT-~!An-7g4K@&=<5%UcOCB-3$kWY>yY3g#VOLg5A$g6V|=Lh zT+`H%x|`+1`sFHe;^wj5peJV*v7T7d%QZj9M{dC*UoefL?UbB?Wr`@r4v5`_Dlma6 z5Kko(WnDVV86GB&}hHz;J-PSvT(md>zP{VEsb*oZcufEt47%*_^R!OWjs`S=sLB?&Z zCKGr=8Z{}UYD}xA(bl8MCCD^4Y}>-AYxC&QF8@Hv*eG(SaP^vo8orDZT2{0XoUx`W z&lEMTB%0^E>Q{pe#@0{Bx+k&C)mWmXv52-7HiBBn2x=jVA0`eJX)Ro&wQw~O0Tf;l zvDqqwnqNvc_;@V6>{^C6-P2>dFqt*ijG|d8p#=y(Qf~E^juo zS+s`Hk_Q;d8jh~`po$Yah#b`*L=JJoD9QkAY;hvR!v-%NGI;Tj!NbI%f)@`Lym+|a z#hV;(O|~g2Vm%65#TaX-t4&v}aiNl*m-%Y%iwB> zfWZ|aVB$vG*WSmYeeHvMsIPsj(W9^ZCS-|F$Cev_^JE8c$b{?=mt|fYH6c65n~J=} zhU^fRP7`N%$PQX?aht9Jlu>r%H6P#HgJETO-mp=!>bx?f|g^z(MZ-JK(1J%Dl&nTF0QBH^!@S@s#?hL8;Lq&m8(TlFL^~j z-EPjzWch@Afvb?HtMe6Ty17NEcr-SZPa5Swouscx&XU9CP3jt(B)-^Dhq<;wao$IY#nZWUi3PHnsJ zua@2T>-|$pHLH}*nH9$ Pk6La%SG8_8Px1c)i8mx( literal 0 HcmV?d00001 diff --git a/resources/test/ipinfo_location_sample.mmdb b/resources/test/ipinfo_location_sample.mmdb new file mode 100644 index 0000000000000000000000000000000000000000..aee65ad5d5ff1c53696f8ed323761c7ec7b86010 GIT binary patch literal 8780 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 N>`;HsK4qQZ{{y literal 0 HcmV?d00001 diff --git a/src/mmdb/asn.rs b/src/mmdb/asn.rs index 23e341f9..e120d2ee 100644 --- a/src/mmdb/asn.rs +++ b/src/mmdb/asn.rs @@ -77,19 +77,19 @@ fn test_get_asn_with_custom_ipinfo_single_reader() { assert!(matches!(reader, MmdbReader::Custom(_))); // known IP - let res = get_asn(&IpAddr::from([61, 8, 0, 0]), &reader); - assert_eq!(res.code, "AS1221"); - assert_eq!(res.name, "Telstra Limited"); + let res = get_asn(&IpAddr::from([185, 72, 2, 28]), &reader); + assert_eq!(res.code, "AS202583"); + assert_eq!(res.name, "AVATEL TELECOM, SA"); // another known IP - let res = get_asn(&IpAddr::from([206, 180, 34, 99]), &reader); - assert_eq!(res.code, "AS63344"); - assert_eq!(res.name, "The Reynolds and Reynolds Company"); + let res = get_asn(&IpAddr::from([89, 187, 198, 0]), &reader); + assert_eq!(res.code, "AS210367"); + assert_eq!(res.name, "Krajska zdravotni, a.s."); // known IPv6 - let res = get_asn(&IpAddr::from_str("2806:230:2057::").unwrap(), &reader); - assert_eq!(res.code, "AS11888"); - assert_eq!(res.name, "Television Internacional, S.A. de C.V."); + let res = get_asn(&IpAddr::from_str("2408:8957:6280::").unwrap(), &reader); + assert_eq!(res.code, "AS17622"); + assert_eq!(res.name, "China Unicom Guangzhou network"); // unknown IP let res = get_asn(&IpAddr::from([127, 0, 0, 1]), &reader); @@ -106,31 +106,29 @@ fn test_get_asn_with_custom_ipinfo_single_reader() { #[test] fn test_get_asn_with_custom_ipinfo_combined_reader() { let reader_1 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_asn_sample.mmdb"), + &String::from("resources/test/ipinfo_lite_sample.mmdb"), ASN_MMDB, ); - let reader_2 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_asn_sample.mmdb"), - &[], - ); + let reader_2 = + MmdbReader::from(&String::from("resources/test/ipinfo_lite_sample.mmdb"), &[]); for reader in vec![reader_1, reader_2] { assert!(matches!(reader, MmdbReader::Custom(_))); // known IP - let res = get_asn(&IpAddr::from([31, 171, 144, 141]), &reader); - assert_eq!(res.code, "AS197742"); - assert_eq!(res.name, "IBB Energie AG"); + let res = get_asn(&IpAddr::from([1, 0, 65, 1]), &reader); + assert_eq!(res.code, "AS18144"); + assert_eq!(res.name, "Enecom,Inc."); // another known IP - let res = get_asn(&IpAddr::from([103, 112, 220, 111]), &reader); - assert_eq!(res.code, "AS134077"); - assert_eq!(res.name, "Magik Pivot Company Limited"); + let res = get_asn(&IpAddr::from([1, 6, 230, 0]), &reader); + assert_eq!(res.code, "AS4755"); + assert_eq!(res.name, "TATA Communications formerly VSNL is Leading ISP"); // known IPv6 - let res = get_asn(&IpAddr::from_str("2a02:6ea0:f001::").unwrap(), &reader); - assert_eq!(res.code, "AS60068"); - assert_eq!(res.name, "Datacamp Limited"); + // let res = get_asn(&IpAddr::from_str("2a02:6ea0:f001::").unwrap(), &reader); + // assert_eq!(res.code, "AS60068"); + // assert_eq!(res.name, "Datacamp Limited"); // unknown IP let res = get_asn(&IpAddr::from([127, 0, 0, 1]), &reader); diff --git a/src/mmdb/country.rs b/src/mmdb/country.rs index c23e4d69..9e5cd9a0 100644 --- a/src/mmdb/country.rs +++ b/src/mmdb/country.rs @@ -63,11 +63,11 @@ fn test_get_country_with_default_reader() { #[test] fn test_get_country_with_custom_ipinfo_single_reader() { let reader_1 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_sample.mmdb"), + &String::from("resources/test/ipinfo_location_sample.mmdb"), COUNTRY_MMDB, ); let reader_2 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_sample.mmdb"), + &String::from("resources/test/ipinfo_location_sample.mmdb"), &[], ); @@ -75,16 +75,16 @@ fn test_get_country_with_custom_ipinfo_single_reader() { assert!(matches!(reader, MmdbReader::Custom(_))); // known IP - let res = get_country(&IpAddr::from([2, 2, 146, 0]), &reader); - assert_eq!(res, Country::GB); + let res = get_country(&IpAddr::from([1, 0, 6, 99]), &reader); + assert_eq!(res, Country::AU); // another known IP - let res = get_country(&IpAddr::from([23, 193, 112, 81]), &reader); - assert_eq!(res, Country::US); + let res = get_country(&IpAddr::from([1, 0, 8, 0]), &reader); + assert_eq!(res, Country::CN); // known IPv6 - let res = get_country(&IpAddr::from_str("2a0e:1d80::").unwrap(), &reader); - assert_eq!(res, Country::RO); + // let res = get_country(&IpAddr::from_str("2a0e:1d80::").unwrap(), &reader); + // assert_eq!(res, Country::RO); // unknown IP let res = get_country(&IpAddr::from([127, 0, 0, 1]), &reader); @@ -99,28 +99,26 @@ fn test_get_country_with_custom_ipinfo_single_reader() { #[test] fn test_get_country_with_custom_ipinfo_combined_reader() { let reader_1 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_asn_sample.mmdb"), + &String::from("resources/test/ipinfo_lite_sample.mmdb"), COUNTRY_MMDB, ); - let reader_2 = MmdbReader::from( - &String::from("resources/test/ipinfo_country_asn_sample.mmdb"), - &[], - ); + let reader_2 = + MmdbReader::from(&String::from("resources/test/ipinfo_lite_sample.mmdb"), &[]); for reader in vec![reader_1, reader_2] { assert!(matches!(reader, MmdbReader::Custom(_))); // known IP - let res = get_country(&IpAddr::from([31, 171, 144, 141]), &reader); - assert_eq!(res, Country::IT); + let res = get_country(&IpAddr::from([1, 0, 65, 1]), &reader); + assert_eq!(res, Country::JP); // another known IP - let res = get_country(&IpAddr::from([103, 112, 220, 111]), &reader); - assert_eq!(res, Country::TH); + let res = get_country(&IpAddr::from([1, 6, 230, 0]), &reader); + assert_eq!(res, Country::IN); // known IPv6 - let res = get_country(&IpAddr::from_str("2a02:6ea0:f001::").unwrap(), &reader); - assert_eq!(res, Country::AR); + // let res = get_country(&IpAddr::from_str("2a02:6ea0:f001::").unwrap(), &reader); + // assert_eq!(res, Country::AR); // unknown IP let res = get_country(&IpAddr::from([127, 0, 0, 1]), &reader); diff --git a/src/mmdb/types/mmdb_country_entry.rs b/src/mmdb/types/mmdb_country_entry.rs index fffa5b6e..279e0b2e 100644 --- a/src/mmdb/types/mmdb_country_entry.rs +++ b/src/mmdb/types/mmdb_country_entry.rs @@ -30,7 +30,9 @@ fn get_country(&self) -> Country { Self::Standard(StandardCountryEntry { country: Some(StandardCountryEntryInner { iso_code: Some(c) }), }) - | Self::Ipinfo(IpinfoCountryEntry { country: Some(c) }) => Country::from_str(c), + | Self::Ipinfo(IpinfoCountryEntry { + country_code: Some(c), + }) => Country::from_str(c), _ => Country::ZZ, } } @@ -49,5 +51,5 @@ struct StandardCountryEntryInner<'a> { #[derive(Deserialize)] struct IpinfoCountryEntry<'a> { - country: Option<&'a str>, + country_code: Option<&'a str>, }