From 783f0aa4be66114f96ea85407f8bd254cb1f62b7 Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Sat, 5 Sep 2026 19:51:01 +0200 Subject: [PATCH] more review fixes --- .gitignore | 1 + scripts/resolver/README.md | 11 ++++--- .../__pycache__/snrc-resolve.cpython-314.pyc | Bin 40957 -> 0 bytes .../test_snrc_resolve.cpython-314.pyc | Bin 59621 -> 0 bytes scripts/resolver/service/snrc-resolve.py | 5 +-- src/Simplex/Messaging/Agent.hs | 14 ++++---- src/Simplex/Messaging/Agent/Client.hs | 6 ++-- src/Simplex/Messaging/Server.hs | 4 +-- src/Simplex/Messaging/Server/Names.hs | 10 +++--- src/Simplex/Messaging/Server/Prometheus.hs | 6 ++-- src/Simplex/Messaging/SimplexName.hs | 2 +- tests/AgentTests/ResolveNameTests.hs | 30 +++++++++++++++++- tests/SMPNamesTests.hs | 8 +++-- 13 files changed, 67 insertions(+), 30 deletions(-) delete mode 100644 scripts/resolver/service/__pycache__/snrc-resolve.cpython-314.pyc delete mode 100644 scripts/resolver/service/__pycache__/test_snrc_resolve.cpython-314.pyc diff --git a/.gitignore b/.gitignore index 9d27c4ccb..9550e48c0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ cabal.project.local~ *.tix .coverage +__pycache__/ diff --git a/scripts/resolver/README.md b/scripts/resolver/README.md index 13ef998d6..87143a6f3 100644 --- a/scripts/resolver/README.md +++ b/scripts/resolver/README.md @@ -200,10 +200,13 @@ then be quoted at list price while the registrar charges the premium. Configure `SNRC_CONTROLLER_` wherever `SNRC_REGISTRAR_` is set, and upgrade this service before the routers that query it. -Upgrade the resolver before the router that queries it. A resolver without this -status reports a name in its auction as plain `expired`, which reads as "free at -the ordinary price" — the price the registrar actually charges is still the -premium one, so the quote is wrong until the resolver is current. +**Upgrade this service before the routers that query it.** Routers from v22 hash +the 2LD of every query, and two things only this version does are needed to +answer them: decoding a bracket label that sits under a subname +(`sub.[].tld`, which an older resolver hashes as literal text and so +answers about a node nobody asked about), and reporting `auction` at all — an +older resolver calls a name in its auction plain `expired`, which reads as "free +at the ordinary price" while the registrar charges the premium. ### Why a name is reserved diff --git a/scripts/resolver/service/__pycache__/snrc-resolve.cpython-314.pyc b/scripts/resolver/service/__pycache__/snrc-resolve.cpython-314.pyc deleted file mode 100644 index 7b33e989ed7a4ab780c329a41d5af62199676f55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40957 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 diff --git a/scripts/resolver/service/__pycache__/test_snrc_resolve.cpython-314.pyc b/scripts/resolver/service/__pycache__/test_snrc_resolve.cpython-314.pyc deleted file mode 100644 index 025a0b6e52669c1ccd96291ff568dec977dc29b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59621 zcmdsg3s_v&edj#kG7K;vBtSya=q)6~TRenbNT9b69x#4L@@SYD1o1FK?hKY7Nv(8~ zMrxB-PO>#_?aw%gYm~UPvYUQU_G`B8=KJ!+yWIvnAk-UeH{15xUGJl-2-Qxs?e6~m z=iJxK+!+v(<8-gB!<~E2J@?#m{^$Sx|IhaPJckL#4|cusiFZF^GW`wxP>yW*WPZkC zGF>uxOfl0lCXe~3Ic8>mEio(mYm3>~Uwh2X{$|Cp*x&3}_E~$EOKDE~+qFzPSI*MZ zT&~>L{+`WkF!Nu^-W-c^x$?QD_q)LPSW(>jyKR$}tl&t`XRORd{r<=0{>Sj{Zd z%wC{o39BifX3hdNOIb|^YUVCbvy9brqGsL#HCM8l`KVd2K+RRGrVBL-7pPf&cD1Ld z`AL&0P;4@ln^1dq>PW3KHOLp&0){uRe-+EdVvmOhWA0cm8jHI7BceMR7X3TKU^EhX zF6bTzhK7S;w94V|jD+1624e&6bHk&tfk?RCy<^Bdf=B5|choNq4#%R^@^fN!G$=kd z=nq!YT`x81m2XuIkDjY?bV^SB#jyhYTT#WY@4gJ{ruiOR^JHO0(WiM7;!Ptqx@Uzh#8j7*0b5XkD4bi1@?m*BV2?V3=*g()dG!lvp?s(jD!tIZQp9_X# zgOM;Fy1}90Q1D_EF2{WSn7i5$Rjv&9!r@>D!+bI37SWa%h*r5h!I7xkX4E$nbc-XQ zAbUfgZFqP~)NyXuCq{$ayp6}j5cdNm-;- zDr(?>Rbi1#o!6{Vt}hBOh;@8omG{aJ^Zcwk8aWNR`kJ76*OM9v>M8s#SYsdfmm!fx~sZ6Iy79{Sf#A= z!J%s3h9k9U267V{$S9yQ6!eaWA!Q8tl~^PUd;>V$X*iAxJ+_gCaZ}ma~v7QjPUHkA_b4xW2v&}M$HOXvyHW89JPeIEy-gl5-XHA z?kRQBj60)mUf@R>^r)9(A&j<)NTnLXAa zquy{N<{cIzfe|2MPT;_Yh@(=w;lMs%EBk4H(<72Sap&HT9g*zLJhF?xB$=SOo(+B= zGSU|c1{OQ^2Mx#m!5TS~8MZqg9JU_?GOsduET@u5pmogdZ}qkIbyip&w06gmb$rEKF*#GRWY=PHe=T{Cr76i9;C z8wOYH^-2z}cL+-bB-blByao3rHVg)OdpC7Kk z*&P!KM%7tM#v;^nXgWcJdQvAs6+(a_F)E9RQQ1t45||j3!^9{D6QgpO80BPQRGtUI zF$qy93p@~iV=hk~%0dqW+*pyPAhrxbRmm?MI=TvzF5st5>SsKdlugSKG)1IOO#l;m3u&h2_oBdvs{Pc7 zf@%*@MLsmmf+A&XFkLfuUb9Hn!Ej8n#Ri9h;&xQ#(8)v!VRy(k)EDsWm3A0HMO8Ey zdwjTRcPQfbg`#_L!mCq%=L=9=GJSK|H+$ZE>g!K^P`arkI= zkEhMkE#)3O)!E}Yb>c(^eh9(XfEO)>q#XZ%Z!io(dO^zaMty{ia@41!0u(AhGqCc*?7aX<{7pVCV7j%54XYEYyN2b(58X8a5_agW>A-)3No>XK zYgr=EGBzFJ0XjQKMLQK8R3yuoLJZ^E9=Q;f)))__a=#x>&&vY&@l!u(eYbU5I6`Cf zO7Tot#aj(;?fH|9|GFx}m~^6nhZS!WKv%@Uu>+@D{55qun`&ztf_*LZEiJyfmgb%P z&B3Of0bii0v8KkqGtk`9AFOY#Yv}LywX_8Nwf_2GUvpo7eP7Man%c8ONF7{f(j$%p zIV2Z@U`vK*YS{JIkAtJVyW?c8+B)x&s_53II~!p&bj(m`L6Jg@3Nw8>jiI~L`6jkBFVI%5xcoJAXL4|$vwiMpi#fdVUW;) z;6-m=Fm@pr3^PR2C;I%)24hSkK(M(t18gqh`4IwBB5*qCfHbrOrc?EY<7G!?grh&x z>uwY77y#;Mylm{I@Tm-d`n&9Pj|zP(sT~7=C$mn4O?(EO>l|x4?R&W6?AXDFZNleE z103ZHIEd<85F=1;go5Go;LK!XRhI!E(meAi0)oZ`fWTm?2|R8JM^mSom}9U%!aRvg z56doStdgNAMZ*;`69$UH6iD~;7$sqL3UKWAk3Bq>p|k~VLnLX2vl-c82xi_$f66M} z!X}D@HLoumkZFn-^!W$aQYO0<=u03d?a44_3qSrmdJ^5iMp~UD@E9+gxN>5AZQNNQ zpWm^V3s=osNttTTGU7Krs##M!0nkI`&f8H-#tCE&=DmECCg?bxXi#Fg2!1TLRozTL8yscUPoG<+DQ?CiyJOrS8VdHu+>w6wV9dduqw#kShVeV7!WT|nIXShmI_|9bAUD$jb*Stz^jmnplYm>J^9dVra~~r3aPyW$Q|qSRiSf_@Dle_@GA}U-qeMfejIqvBWTFWa?zb)$pLr5gQoo(=QEj4^Wqeg@~0cFaMrHT^c*$&Z>KP z**T6oF1C~wQ~v|1pB6m}^Z$)?z+)OVF9p1N7rC6YdK$gM`$*rGbm*3esuT(GcIUe@19yH3(O~(*D|smrqO<$IGj}Yx|z_JI)*4c+JV1LT3h`8e?zzIDm>t zF_tmcX~>2U9f9_^zFI~F7ib*x^Ux~K!;mjTS})9kLe%(d^h4bn_4YyL^u{7U5b~rj z>yY$V#(7yvlW$Z1$Tmdtv~Iz9x+%0}n1vrf1@ANYY(D$LsN+4RO7urLBDN}1#NKP` zwfCCptsZlUDI@@On9tah8evWEt6no&=pL188@6aq8`e~5=&-fh)J6PE((%LwZJ8U_ z=(Tukl{zO^k3HcDGAkqU6(-KCmF4#Cj3MSeDbZ!b3; zM-SJ)l~hv#d2%+Ga_E|ncn$8UNv$dOmA`l&o~>}af9Wx^$uF}8>}`Y{nZ4!z;AFS; zlBwHjJ;op1;2Sa5swb1uCG}%*QVtuG?s)@z-fio0XzxH5q$*?Alm- z&92#!T~n@Ix0aQ>vT<(Zw&|7ICL7}`>t>hLO*!ir>R>cXB)f=|#d{<=watjAKgWa=>;+H3;v;4yRpRjh|bP^aAMHMamwT{K;?uQeUV5@X8*lJHLJ zpc&He6L?i8oI%{sS@x!lmzT6ovubeBdnJ%x1m)G4`ceA|phdsZH+ED#Bt7^=LdO9lvaSwip zd#Rum!VFnbE)%-=kaGrtJc%SL2u?*712kSQ8*oEaB|0Gh5`UZ8_#G6{EEN6lz}(MW z0VFQkX@Hdh-ZF}Ii)!ItQV+g~;{GMm?ZV=(^}O`dSDyOn>3HF~iH_OAipyEI3JNdV zKD60#>hCyBW$R#O%e!5)VyCB0_-ed{#MMts$=*Q~EtZwkkMkBV{iYP|Fqelu9V zW@dK9&i74kK4+>}E)o_INpU1rQBh6BVJf~r#W5<#f+3O{jCh&~vd4WOQt@dj$ZuDyrGjK%kyee~WrK8$A{Df}qvudCmksjx+jHsYE$50$9d~VZ`=-13 zX8RN7yIFR4ZRA_+7tMDaHv6Z|cbyjdG4ov^8<&gB_9sz;xpWla_g1U@6slS52h1M| z%j_r2cT80BwN9_}0e% z#Ip?4Zn;#@35f4zc(aH6JVbJ9Ng#hj3W1P>`BK(%pPAIGz2wRL8~PK{#k_C1P5)v#|n*>~mCuVZG1O*>6$7 zmKR|=*c%AA)dQAqaZe4&vbL!U%qbriND2_&k#K=y;;sOILO5YC^Vq3E+Hh;S}} zSc2A`x^il~{k2mspL(nP?UUC|PVMT7S3VXm_slrE^|W+nd}ZzIvf3#pcOhYZDo~Bn zmx$k>qMf=zbhE!-7W}g1Zc8O;zUMFK5pq)bTohZWc%awP>`}O-}mIAVKBnhv&+u+vjEzQzd>0?~=0F&m?R{#(xFS1;UhmW;2w9&DQF&1h!5d2=1O`6 zej3FhDx4h<3sb_2EvWdB`in8AA#pdoW;+$sQI0wG;Y`|+3^!@q!~TvQYf~ENtZ;C= zb%3rMq@taQ4iu7A9QJb`rNeaX2o*=EAat#Zeql^RD&VpX{0&t-kK&T)Z#l|=?vDpt zkP;BeaQf4ErIY>~xpL%AZdQqd{Jieuo8Z}{_w@Q1elNk(i+~6SM40~^>je~Y_?vuO zfViX4hezY-rE5f^fZbJbikx%+m z2va}LgOLGa`^8fzW}M}8N<;od8t^Y4;rLcvIe6BFe{8r!){yaVJ!93Y86X)!MWXv$ z3m#<$o;D!0y=KiH5(*Nzwz87m$J-ORAnFq1Xb1yPkTHeMc&ydL``Dx$a-IY)KQt^k zYA!bJ?639J`D>)C@W@bKP?YR77i;V4IW~rbH3a$@2}oJoX_3oT907}L868a>TsVKh z2a?QnCg0BdfSt1#0TH``p<)~ zYUyBr%{TE(kOvu)kPkW%@~S?V31T3(IWOERscDIybDuh2!G`;1WvgFX_42BT$6j4? zIsY%0JqZa%P=%G3*TfOzx9g_Rm^tU~=GeXCBL=g9)_XTR?P zfN|vpV==yruKTs_n@qH}*wR^nliiquZY-W82G=rp0Idv~tbbm_mx-AP-weUayeV56 zy@s$POVI#UM3T}1;SlSm^+A4h?AkyCi-=uHT_-j`N0c}KFtQUXCM$2Q73UJQiGv7iX;<47R~bdiC$$Cu!1eGN52yEV5c)>%WQ5~zzjG=b4opfl*bR9x_ zL}(NcKvG}Q;juhXh&u+Xw;olcgAnmYXpTdOok>@n*K%~q$jm_U1w5-7Fo%86!Z5TU z%dy;u4i9m-CLo@h3xok;1rQj)B{}l>ijp_Ug#nl|kq?1HJL#|?=6LXi@(HA#MjwGY z3W~ng@KVcHTE5yEFIYRVakgMHOlLBj^~6iJEdtOkOxPxS-hTSp)3ckK;?CwY@J2Af z;Ejwf4+C$QQx$H|lzdd`U=V~|_lrTKN;;MLCXiS~k8_4_7(29pBD}?bbZa#YAx>>E zJz@9QKw|A0bTO@f_%7a_NRbGH(xakT+)aR~M#eu9s4>#Wq3FV3I6ypRj9^OvGXgEd z$PEtp5M(JGG6bmyZf6BS6p28o5cTG^*SF0UR8Gcb3+gj~mH}BZrZ+MiIp_b5y>993 zUph?ngsV$s^zaJ#&_mS62RCD_Jy15uet167-7f}_cEslnLxac_PlPbsvX05U-Oa3W z?%i&1^;J5SE{?BCgg1uJ7|=1{u^kmOHb{{ktY{_y?A9}|BL=OHQlC)x17Zx}Sq!c% z!f}~YX9!{$pIJrVbQE2He4k(VwT&-Te5K;6+vE9bE?X7c)cy9ZYrAGQ?TnWa-;$BN zIdAB3@hIt^3?uX>9aQPCjS5|lN{sku>7Pjaf2TNuQvA0l5&(c_c;JR!g#iMx(eXVs zhSQ(niFG>alxQ1UfU`AbgFZdcdp+>IPkiSSvpe?3oo$(^lT&u;!ib_5$;U^@#ipki z=!=nvDJwXjNF+#3I?{@mHXSF-eI%RD`JO|v1EL072Ll!7$R{_3I5?JCsSmC|aEBZW z`-AS9^yuU#c)d)+GVssCR4bW(<}y?=w@d_!#5|;Q>PPOSfS3FabY#m|hI+tODhSXX zL#Hm8ewK!_HlRx38R2mzC2;ti6_AD=c^!y@~)y2C$-Y95H}1&DY42pq}&SAPMan@JiiC(x+E% z7;#LxcNb!Wk`8zp$*VAvvRtX7{DsPosWBLjm0-lQp?#*ecm^lCEsOE{@#r*=hT0+3 zIH(sYC=Q$1_O4mQe};E))xvM#EWvE|+jQ%9P#78QIt}rr-p_V80>>Q2?#U{MNI!VJ zD0$^-3K7M!S5Lsc3Gaf!Ai*Ujy?@JC!No+UV9u)&IhZFdj5!RGuAijSBp(fpcMzFx zhCl)gEn+F_*`VL=dsciA4`DP&E6J?`Nu!~9X7Cg@i~MkD_rnZZH4PHEBK$I)R)zdB zKCoHfmm$c087Uf*sco(CvfVeHoGm-_V<(V>>~1k`8-MK8?77md)1_PADt>#_wN=-j zj92WPt2i)SaUfpN9xv^zJ*cg9^q3#I6bF_w%0)x9CUhgp z+9KSPbSQ=>Jy637P*)3{hw3jQtm3ivTJ-fjS^8hfyIGK@0oF;u9R~PC_kM!Lq+@a4 zr}RVl3*15GUSaI>OO701(E+gt+>jkCWWZ0B;C?YO#BPvVQ6;$X7{5e65n#q{$=}4@xQZz;rAF}}V(ij^3s9>lHRE%8s zbnXRDq*-$GaUk6kBmi>$Nrcu9l9TW#LsE1Txmyt3HtG!ohhqb&D64G|D62NUa>wkl z9muZ6Rt}576#qNAD4EZWSuR%H7gRT97{`eEab)v9>5Nd2$ke=qqs0G#LXVN8EdB*L z6b*kduKL}{1Ro#sDqH+FN*#}6sCLu9d+{XK9}m4=hRH^*N3)Qg{* zXpWau&Xv?mm(;{d>Shb;u6NHCHeb$S$t;+cSn)*GtE(qh&X(2B2o1nxcE~6YMUraz?$h89d2I}%dGmyd&*#IeNH4PDtiqMSRn3-RP-9X*P*x)pl zb^`Vi{F~p5f>}BY-JZ0VM56p-rEKBTB8LG3-Xf57-OPYNxi|a4Y(qD=1r0Ld$Hb{^ z@_J$>k<*4iG6HAYaR1{Gh)AL}H4=Un5_#B*q@)ATHph_e6xTH2OIuTl{qO{4 zfaP%k=u9-c+46eJ)Q-b58@S1qt2?vhR!JAm7R&+aYC9D)!F<6a>cac^qG(}@VksS! zj4h-~Y3dj)jy7}@Ur1?P`o^oFASk$9O36wzJ%O>XI6AR$(gq!R8Yz*0l5z14NM8it zHJ}$m=3z5HP6ch$kq-^MYPO68ft-e%9ojQS@}DN*DYOfSUzQ2i!XRhVpED{I)jagO zV5LhwG()=5Hl$NsCFQEt!(Yu;!J=b>bB-$ch6x_o!O#g34+EWOch$2r=;V=%G?O(1 z&KU>M7p~bg_S;zkHWA5YF8*&S{t-ngvM^paWPE}ujybDA83Q+bn50PM#v<~__bU}O z_yED;|D`vP$)s~H0lWBzRD6kwNh-cg#WgAj#f#rUf!t4T&^bdDDwdF}aMa- zP<17)i#owRM{)1tmb8U?p2m{4@Pi)04D><340kPXWxH&IX)qCS*``#&@5e~`f$8UCng)jS7*|%54H|@M(o87cKUb-g%zodIUJw`Hm zLXil>SJ3TF@l_hY(gmEa*=#WUd<@maPAYy##lNFsiVAZ46D2DCii-b4#oto#cT{{p zg_)p1prV$3)=^Q9Lhp;3qr9_TVV<^%Yn_sjN}Wxs3-(w1A{mrd!);pmAno8{RPSf0HcmS@kw^6cfZJbO-- zXD^TC*~@2n_6j`tF&BKU3q1vp7F<%EM^3HSLmtB4bwDful`A{x1=*1x386`Cs6dg;-ju(6L`PZMH zTGjMVFGZesl7>1Lh2Gng(4@2?aikO%$YGkGE_#Y!(2s?w9(2wYYB^32F>3Zft=MaZ zHkM*Mc{~N2$^nRp@f3DcXE3-QOMpTUmlTgy_)5}JjY+!uyLB*}|z zt>9clN_YvA?OX)uOiyjs>3xXxlLX}rTxul%PLAZ?^mN(viPt_#YTfg7>Px&+`nY{&?4kC+$q*Yu;8Y8(D*aN^EI3R zeHaRSv>TGLtc?UCJY|3&w3>!`78MB78-zSur}7u*TF-r_&rbzV zOEF8SuQ9q!;fDHRv#2wlqTwy^@ri4!xcs?vEWhJGM=^ru{Y0rzKelc0v^p6c=bOR5WmA?N?z#+GBtg7XSE{2oBoOT@_P*^Wa;y zw{yOg^X=UD#)j)7vm1Bc2*gVdE(8K+ZVH}M1o6>>fDUbZtRO(Vm>vY;1Oj3uhBpQO z?`5>qC(o|puB`Lm`WyTEkn_I2t|nMp z+gDdt?+XTf{bzf`djtWD`D2^`WBz1Sz4-UIm*DitGk@tP+!uY8oAz1iFJ{}1QqC{g z1%Pb-qh8u*Fe)82zyM2Y>h}l|xDM}Ug^%-)r-eXZ^YvY`+xEoE_TIQSTXy8f+inVv zbNTHRd}L=uQF`4v6OA>EI^&ecRaM+b1^E(+JE*9kg1oK7CMwcv&vWTE6{IeXp2GVz z?fESvGdY%!$0Qeu^pzG;k_#65<0!ep++y!$S3231$ITx?h29GVIhFjw=nZ}}t{(W! zj`=bC$*dq>x_TT+b(g0AWg$ydQp8e~EJLc2VyMlRvs5L;lB$^WutWzvOnLq~`bT>6 zoz4BwlDD)p23neS`gb-pH`niMY-ns~#_lCM>uMSUwZ59#nz}xwXcwLImCBdV=c&k> zxW$i8gRVp8I%?0xAH~DvBLD$0(21wfuakzLNO`aJH=(x5&L(N&X)M{H`N5#_|l%?(3AK>Zer}3aZ)d3}0Q5_g?qRV)YlImdS^`WVi4d8$Z zj5fJhsv2J190JQ^6@Lre*m$CW`L`d_R+YL$vG(lMam2?)qlCs3@8SG@1m*s zZD=Z84us@H2w#>{e5xx7&yso?zvZ+`s-ZwlyOhyPAds2B^2p5upiV3gp{6=F&` z_AO|ZjzFqW>;WKbNqteFb!mP1|6#?ZTj^}YibpWhdVgxk#x}Pn8j|;mKM1}Cu8w74YMT;Q?7-6TeD)P=YueJzW&Z?$mgT}^-$3wGa z+b2)o6k1X>(DIx)=YP!FO*3cexNGzC;B&^}){W+i)RKD4qFeK6W*CX95}rs&Fg5o1 z13_#V5M+T7v_LD}=M?J3{8!GoFZd{}L0=>iYGvC7ouiQCbM64P)eKO^gQ&Z<(t(ZZ z5nVy?$_TJvYaD0vlY*Juz7Tl@jN+N7A3H?zr$)lj;h=x8ACX8^IvC5xHN1r|4~DlMC(t0MR<^KEjHfz%dK4Me zX~TIRGATqt08Mge0K(FBOjDhvpeaIYs%m}_P5m|Xh(vZ4KvcFm8C>&==JMA}=dS_4 z=2s!__Faclt%jGjIc|8@ySIo@l@Wi!Gi?RW9`z^iK}SMp#+ITJp+HdWy< z%*x{&X zhQ%`}^U8NpA{)Kjj+b^Y*|F<9W)WLT9uo=y(?wIdq5@=wd1e@HAcs9#)dX zF$AAD`;BSWf5zwRAcv1^;>!|vf(0j@`|YHWnigOOJeFZyq^S{0K#RT-L#rGL2dip< zjEFxXSQAKjifkm4@X)?QD9s!)6sh;QNyqHkI_z4LEc${}>&P+> za;#Wk=!3DJKJ_qtw2RJ?95I*#)=M|MR8XoEkwTor2o*6ZE>iIsDn3g^dcTZabeoFT z@sGtwaled$)=NiNXrt_$p#?NL;G0p(iY$90g);8C>&PO<3|E%D^{&fKk&M`brs=N3 zZm*!A$BGY8^uSGnN`|@E3;p;!^&k$6j`?q)SlCU2Vi;qBr!1D^Ss8OYvpkl|q8Xhm znlbNet|#Xiib!%GM%o<9XAzABETYlHA{q-l`Eb@KVlEp=yUXDE3ePf>C7xoGrJm&| z%RDPkuJn|kT;(Z^mBX!LHQR4(mE>$2VcS{sFn^9>fXUcTPf-RjmX*>?nShuW#GUy? zq%pie5)$?m3u)pJwh~5akVrUK>FyhevFj{=#Sy`_86@2Y(2CD3@0Ef3z8JO=h9)TL zW;quEzESr`7@`-{2Rsb}?ohVfD#&Fdib2Y9L`P^Z51u^{Dh0L;G&b*06QV&J8wmy6 zpB#zAxUwRQjShVwycMA|OffJRs}frYU?|*^d7+T+N^P*l-{Pz5Yk`wWgTJ}Isjoh` zGtlU3@z?b?^fd=-15Lhq|IV5O1)a)>-b8ye;X0+TEK?9XD2MJYE&ilKcb8P%Nr&z( zvHwYj?ye*07Jk;-yA$@%KyZD2YOMsn5_}IoJd~K=0en_ad(l2CXO=5(IYVj5+0mt* zDOXIURA+2_52tZzcTvOPsNvQ zzm|0DqH@U%AJNc#x2fI@i0&@yOe=<_XlHQf!$1R26QOD5aMqKg>p>@Jn)@NuD15k)~R7LY#9keQnu-S%f(%5zE|62A-YG9bD}$rB*c z*!A*>(jGDjrTY$@1hXW!5p^z=b|i=t(4c@)8^^%c6mBZ9)0|z_z$QC`@>~=?g~9(XCH!Xc6dxD-=8pxw<9uN z5GPf0u#fjbN{cdPbTgC}*cLir+saJ|3`{!T!~?`Zx=?_FOmby97+>2ySJ3fZL5Dt` z|3Z9C(`-r8l&dMJ`l7aj)+Y>@+M&x=pm{$|UW~74o-Jvfay2KsL7!hBb9RHbqSqU5 z)P4K;_?msQCHtma`S^cdIp@Y{=f;Vi$qjEjHRG(-96&r1D`uQq6W@0>zP5F) zVE20kyY=6nCi_9!?Xc&n+or4A;%g4fmK>OJ9Y}n|nfTgWa|NyM6}0MK5#!Ii^Ym=> zsrZ_%*^;g)S69M=Q#(52YfsG;biG&5b-Q%cc>BciSC3B?!Cm62{r1Y$+knvG|(fvn9u;T*r}=;iZ-rTc%c5U*C8=`o|Tst6SsCc27BX zGX|ITzdnWi%};cQU%|pa=o^6_ca41s7sTJCg281wZt!iPk*q;>K;sUg%M1XqmB4NX z9{C5DHwDwWEnm;STKv+gudKR$2b`(&v~;Q&V2N|IDzO(0c5v`< zO%5C{a0y9ip*`sVD;&HCyO2ZSkwZZrwn8NqS=j`l60MSJ23^y%Jbr8u5o5j^+$262 zb})@l6+={rHe-_Q7x0-%lDNW@o^Uq`F6Kzta^SdBoH#)o^$LE@U0fk8g zbE}y%xiypQ)l#+$Z7j=RC#VXGv3r#kC^0C^;Y)L_L59JYD1H@pB}dPxp0*R-_O_?G zQ@tT}%g$TOr16OnY>>ltx8XbF!2bbzF3Im@hR-2*^=O+iNktUMeBXEr2J2Z89 z`ix>6rhv0kV{0)j8LcAy>2-RuI7BH^Ob`WwmEm*w7c$lV6O4VbmNg9 zxBukSyQgLwPtUr~#LLfqV725pQej(FXFQD&WOxUElMfAw83Y=@xz4TCraZj__(r-c zLoq4ISrA+E5c*C!5?C-9Po_&OPJ2A-naG7(G+qHP`sO1#XtQC0%Y>S1t802`%iwg`f|47wQ*SSdCcJ8b9xpVd^UaW>F+!}yM5n`us;E+ z^JblECbHk&c5U0NyWx85d(VI8`5!NzZR(tLccua6Z1jd9>Y5C|jEOV=;Ac{Tdo-lH z1VE-uL=BYYxM~ErH0km&OiMtOb(E_ngoPxc_%nsdJ>xfF6J1@a$ic7cjR7L&+f08S zZE{5XZJcF9y@YT@f=Qk)fNW$6bP`}n_Wn>LA|`qm@J)gU!eny|T(QYg<0VTC$pF$0 zV}MLkotS{=dGz!FP$@Co>!)4ovH5f4^~kJi=ViMJbnt3?>eV%GEt?F?Rqday+W$`5 zY*hz94m@hbsmxiOw&I)9VNXnu0l?v^iYb+;gyIM7(4qX*694Fe1PEud!w6SuImj8V zhQ2oWU|gZjZsAFE_%{Z=1Z=7Fj$v2h`U%{HR$r$0T3Eol=p9cd{4JajF4U+!11|%F zC^@-5)6r-r41=kpo+TOM3GLY=zv-9itK5)2NY z>&Y-!{Jpi`SsUNjCZ`=)G)*s?7Rtsqj1RtAH6v6o(3GzX&91DxDe(Obj17k0W!(T^ z$v}jk>R}9o8eykY7ELnIG{Ss%UWZSVX0@7zps4DP6NxQCyyQ0}uz(e2k%?l7z(MKf zHIUGtftYg61twWNBqjY2+fx--MF9ZXcg8;;dn)?4MB|P0_e%z3(C1z3)0YSUc=ic} z@~QmXJLd7+MWmg1>ZWiil{1sAFv9#4zVyLxi#Dyg2~x3!GI=KBDOa%)rrbbs(6wlQ zTYyVs;9KmJGr>D~%H_0ED$g(FJl)|r2 z>L=MqD(93;PGzN}E&^vF!wQEUX_parFgQ|o?M?UWWda81yc1}}k=Kt*#@sB6VHY6bZvUh;6Y7EaGN)&Y<9mLB-A$U@~>VmWdHw7u6h0eNRChGCNC#XEC?~Zg_!K zSw$9&$*x9y|cZ(7+AW-WNnD*;}3t|t+$t#Dxe=?%Fl#hR6{Mjkzw%d7yFPyz{ zc52n`c;22V=iW3MyQnnxzp_pN%w%e&feJ)1Lw;VPxzAwx#Z0V}4ipVoDvg3>(Do&8 z<9c=qeKVlSSORIxxpI=YzaZc+bN#o5RGB)QOM=M+IY|j8{vl!3lnA8#GA)K{MG$}# zP!fDHbO{3y)XVBE{oY0L@`ssGg@65wL*j8ppj;LiA}vmtMdow??MX22MhvZ(E=IuKE)8X z*S@u3Qn6P)Hd}q@$D3xWPQ|x%%?OX_smj&Wv(B{>C2ZI6b=dOfPYb?ZfU3=>X4joc zqm@*NN;3vO9U1^IeJn~Mh88GB-lgvhgNU zbk3w2aYf$I<2@4xnS}i+euiXq(~;x#`}=o%rq@xi#xS0zh8|7w zCV!bm`U`YJBW%a$XD1cfSbu}+QDQ{#TU7iJ6)a)nAJf?lDtCTiXTxyIg&EO z{m}jbA{E6nfM3NcS=`UhEf)JpGh95dtC=qT=T=_Jr9*6!v!4~0UpjfKa2X|R&BG>V zYp}@~@(yilxY7RO+Iyz82o5@6w%I$Bjm@&L-C2>1GPzbFeMXa#?_olLZLndGccU2=6Ii=(s@2?-0d^co2CwdRTzZ5Abp=2F6%JO~F^c zz5y-02>~rYXh!TEvAuI?UU2o2mJ5<*~<34#I+?U;4#sMOzMEzyPi7zUjf zFs5B<*o)FL7?I>tpfIj9qqH@%1we(0Pk)elha8AZ}8 zxFOo+MA%6eqw?njQf+t>1NY8~+y@IyIYLh!rGjJ(BK;;gFoLj&RBY6VKf^1dpTg~j zh(o#l)H{}`m9*V}VXjqieBXoamL{w7g!#|0o&nJCH~IK=3OXrC8e1jo(vy08-! z>hUoITKK)R#Ha@_yB|Sf)YXger`EKGdhu|HF%7B#MPWd;$nzX1W__`BTU*V_weuLS za!RUfPki%2e$eSsio(|RS-g(-mVGS7mToTilR zF2D8MvFr8icnhh_k`79L z0i}x0VL|H`PkVE}z=u>^!K!eC0(r3~`ruWJj${uKgCe^>BJW!9|UP% z(wuYtpAu*+u7STM=;%Wa`OclliZiuwXS}3wp|m*XDMi<=8KG6xYK#|8t*M$VtG-@w zebtPx2iIT7yOMYH*@=e9oHzE}6!^||2@D;XUm2>VGm%ms( z(QvhVu5jyY;nrL3jc?|@o;!Is?r!*+?Q40rSFU-j^5x2j=i@7zUd+B~*7nFOo;d%; zYNQ0k9+_%nN%6$M8*8o?&$t>t%rO;JOc!pQ&&9hw#Cs~x{#4=C`%%(|{8@F|#)Ip! zf4DC9U|nv)YFD{WQh}sXU_Po%(3F+21kX3saIF$HBRvlUIE{c{9U0Y0@(x~vh0T&^ zVbeb$t1oGTHIc0mmavHyisT4KJaX8vyl7-ylDbfIF7N8nFrYt5CP@yr@QDj>-lk9V8o;0E}NxIVHmb5o}Z1kUwhP*7(5U3Xxpdo*x(vU1h z7C7lesLqYb7iByt}p03E19FTBgh#d?K_DKaGRf8hJlD*Mb zASjBGWiTQM-7!jneDoBfep0^DvKJL1qIi#R!CwlWK!kaR1~2-9!^8nf2iaGsx^C`ZPSV~3G-5|T zqCkVd3Agh~=JK|@m$&6D%iFo%%KdiUTwdc$UgM1ox0jX7E!#Z3Z1b(clJT`uu8P~P z@~PFw;;!TKc589|<@OJ)ru?QmPE$@ElhFnytZzDBcYY&(MyS@)NeFq91w1<(5?GXTA2T0{lWG2AFc;yn8UKOiLJO; z;WD)7XvUl*o6X8*8zI@{W7^#mEr99g6swkRjPV0agulySq9LO0J?8Wn6~L6*ginY7qglA2Jm(U*(c zsg8>ZLa>sso42=DEW%jhV@=V0DDPO!X7kT&R7C zeIffw_6r493dSw3Wxt<EWW&lR~_-HZIg%LTpXp3;9>_=Y*lwwIyD>YaVflmP>ZDBouz(H$M9tbJ?4xvo|9rX!edvwp%9q7o4AU&Y4Q5 zP4N4hF|E0mwb$&pIxx3l%k+vZ_e}V4?|>z2HlHw$AK@D++(Y^y{Jhs^ead1!Y}V?s zpZ6}>TFkxXt4HRFH%%9Bx@V$a_b!@;&E_8S_}00V+oxAg3Tyl0|c_dLkxXRf>Y NetworkRequestMode -> UserId -> SimplexDoma resolveSimplexName c nm userId domain = withAgentEnv c $ resolveSimplexName' c nm userId domain {-# INLINE resolveSimplexName #-} -simplexNameAvailability :: AgentClient -> NetworkRequestMode -> UserId -> SimplexDomain -> AE NameAvailability -simplexNameAvailability c nm userId domain = withAgentEnv c $ simplexNameAvailability' c nm userId domain -{-# INLINE simplexNameAvailability #-} +getSimplexNameAvailability :: AgentClient -> NetworkRequestMode -> UserId -> SimplexDomain -> AE NameAvailability +getSimplexNameAvailability c nm userId domain = withAgentEnv c $ getSimplexNameAvailability' c nm userId domain +{-# INLINE getSimplexNameAvailability #-} getConnLinkPrivKey :: AgentClient -> ConnId -> AE (Maybe C.PrivateKeyEd25519) getConnLinkPrivKey c = withAgentEnv c . getConnLinkPrivKey' c @@ -1279,10 +1279,10 @@ resolveSimplexName' c nm userId domain = do resolverSrv <- getNextNameServer c userId resolveName c nm userId resolverSrv domain -simplexNameAvailability' :: AgentClient -> NetworkRequestMode -> UserId -> SimplexDomain -> AM NameAvailability -simplexNameAvailability' c nm userId domain = do +getSimplexNameAvailability' :: AgentClient -> NetworkRequestMode -> UserId -> SimplexDomain -> AM NameAvailability +getSimplexNameAvailability' c nm userId domain = do resolverSrv <- getNextNameServer c userId - nameAvailability c nm userId resolverSrv domain + getNameAvailability c nm userId resolverSrv domain changeConnectionUser' :: AgentClient -> UserId -> ConnId -> UserId -> AM () changeConnectionUser' c oldUserId connId newUserId = do diff --git a/src/Simplex/Messaging/Agent/Client.hs b/src/Simplex/Messaging/Agent/Client.hs index 7d51ed3e3..4557541af 100644 --- a/src/Simplex/Messaging/Agent/Client.hs +++ b/src/Simplex/Messaging/Agent/Client.hs @@ -69,7 +69,7 @@ module Simplex.Messaging.Agent.Client secureGetQueueLink, getQueueLink, resolveName, - nameAvailability, + getNameAvailability, getNextNameServer, enableQueueNotifications, EnableQueueNtfReq (..), @@ -2004,8 +2004,8 @@ resolveName c nm userId server domain = -- | Ask whether a name can be registered, by the same proxy-preferred path as -- `resolveName`. -nameAvailability :: AgentClient -> NetworkRequestMode -> UserId -> SMPServer -> SimplexDomain -> AM NameAvailability -nameAvailability c nm userId server domain = +getNameAvailability :: AgentClient -> NetworkRequestMode -> UserId -> SMPServer -> SimplexDomain -> AM NameAvailability +getNameAvailability c nm userId server domain = snd <$> sendOrProxySMPCommand c nm userId server "" "NAVL" NoEntity availViaProxy availDirectly where availViaProxy smp proxySess = proxyNameAvailability smp nm proxySess domain diff --git a/src/Simplex/Messaging/Server.hs b/src/Simplex/Messaging/Server.hs index 0e7b6ba2f..8964d8e0d 100644 --- a/src/Simplex/Messaging/Server.hs +++ b/src/Simplex/Messaging/Server.hs @@ -110,7 +110,7 @@ import Simplex.Messaging.Server.Env.STM as Env import Simplex.Messaging.Server.Expiration import Simplex.Messaging.Server.MsgStore import Simplex.Messaging.Server.MsgStore.Journal (JournalMsgStore, JournalQueue (..), getJournalQueueMessages) -import Simplex.Messaging.Server.Names (NamesEnv, closeNamesEnv, nameAvailability, resolveName) +import Simplex.Messaging.Server.Names (NamesEnv, closeNamesEnv, getNameAvailability, resolveName) import Simplex.Messaging.Server.MsgStore.STM import Simplex.Messaging.Server.MsgStore.Types import Simplex.Messaging.Server.NtfStore @@ -1499,7 +1499,7 @@ client nameAvailMsg nenv d = do st <- asks (rslvStats . serverStats) (selector, msg) <- - liftIO (nameAvailability nenv d) <&> \case + liftIO (getNameAvailability nenv d) <&> \case Right a -> (rslvSucc, NAVAIL a) Left e -> (rslvResolverErrs, ERR $ NAME e) incStat (selector st) $> msg diff --git a/src/Simplex/Messaging/Server/Names.hs b/src/Simplex/Messaging/Server/Names.hs index 6e4e90540..50d106d17 100644 --- a/src/Simplex/Messaging/Server/Names.hs +++ b/src/Simplex/Messaging/Server/Names.hs @@ -11,7 +11,7 @@ module Simplex.Messaging.Server.Names newNamesEnv, closeNamesEnv, pingEndpoint, - nameAvailability, + getNameAvailability, resolveName, ) where @@ -75,8 +75,8 @@ resolveName env d = do -- | Whether a name can be registered. Same timeout and failure handling as -- 'resolveName', which is the other question this server asks the resolver. -nameAvailability :: NamesEnv -> SimplexDomain -> IO (Either NameErrorType NameAvailability) -nameAvailability env d = do +getNameAvailability :: NamesEnv -> SimplexDomain -> IO (Either NameErrorType NameAvailability) +getNameAvailability env d = do r <- E.try (timeout (resolverTimeoutMs (config env) * 1000) (fetchAvail env d)) case r of Right result -> pure (fromMaybe (Left (RESOLVER "timeout")) result) @@ -114,7 +114,9 @@ mapAvailability NameStatusResp {nsStatus, nsExpires, nsGraceEnds, nsAuctionEnds, "registered" -> Right $ NATaken nsExpires -- registered, but its records point nowhere "noResolver" -> Right $ NATaken nsExpires - s -> Left (RESOLVER s) + -- the resolver's own word for what it could not do, bounded because it is + -- its text, not ours, and it travels to the client inside ERR + s -> Left (RESOLVER (T.take 32 s)) where -- A lapsed name missing the deadline or price that its status carries: -- withholding it is safer than quoting the ordinary price, but its expiry is diff --git a/src/Simplex/Messaging/Server/Prometheus.hs b/src/Simplex/Messaging/Server/Prometheus.hs index 575f699c6..421e0e5d9 100644 --- a/src/Simplex/Messaging/Server/Prometheus.hs +++ b/src/Simplex/Messaging/Server/Prometheus.hs @@ -465,11 +465,11 @@ prometheusMetrics sm rtm ts = in "# Names\n\ \# -----\n\ \\n\ - \# HELP simplex_smp_names_reqs Total RSLV requests forwarded to this server.\n\ + \# HELP simplex_smp_names_reqs Total RSLV and NAVL requests forwarded to this server.\n\ \# TYPE simplex_smp_names_reqs counter\n\ \simplex_smp_names_reqs " <> mshow _rslvReqs <> "\n# rslvReqs\n\ \\n\ - \# HELP simplex_smp_names_success NameRecord successfully resolved and returned.\n\ + \# HELP simplex_smp_names_success NameRecord resolved, or availability answered.\n\ \# TYPE simplex_smp_names_success counter\n\ \simplex_smp_names_success " <> mshow _rslvSucc <> "\n# rslvSucc\n\ \\n\ @@ -481,7 +481,7 @@ prometheusMetrics sm rtm ts = \# TYPE simplex_smp_names_resolver_errs counter\n\ \simplex_smp_names_resolver_errs " <> mshow _rslvResolverErrs <> "\n# rslvResolverErrs\n\ \\n\ - \# HELP simplex_smp_names_disabled RSLV requests rejected because no resolver is configured (names role off).\n\ + \# HELP simplex_smp_names_disabled RSLV and NAVL requests rejected because no resolver is configured (names role off).\n\ \# TYPE simplex_smp_names_disabled counter\n\ \simplex_smp_names_disabled " <> mshow _rslvDisabled <> "\n# rslvDisabled\n\ \\n" diff --git a/src/Simplex/Messaging/SimplexName.hs b/src/Simplex/Messaging/SimplexName.hs index d07b74205..b309b661c 100644 --- a/src/Simplex/Messaging/SimplexName.hs +++ b/src/Simplex/Messaging/SimplexName.hs @@ -97,7 +97,7 @@ hashedDomain d@SimplexDomain {nameTLD, domain} | nameTLD == TLDWeb || isLabelHash domain = d | otherwise = d {domain = "[" <> labelHash <> "]"} where - labelHash = decodeLatin1 $ BAE.convertToBase BAE.Base16 (hash (encodeUtf8 domain) :: Digest Keccak_256) + labelHash = decodeLatin1 $ BAE.convertToBase BAE.Base16 (hash (encodeUtf8 (T.toLower domain)) :: Digest Keccak_256) -- | Cap the name at 253 bytes (DNS full-domain limit) boundedNonSpace :: A.Parser ByteString diff --git a/tests/AgentTests/ResolveNameTests.hs b/tests/AgentTests/ResolveNameTests.hs index f55faf75f..04ba926e2 100644 --- a/tests/AgentTests/ResolveNameTests.hs +++ b/tests/AgentTests/ResolveNameTests.hs @@ -23,7 +23,7 @@ import qualified NamesResolverServer as NRS import SMPAgentClient import SMPClient import SMPNamesTests (testNameRecord) -import Simplex.Messaging.Agent (resolveSimplexName) +import Simplex.Messaging.Agent (resolveSimplexName, getSimplexNameAvailability) import Simplex.Messaging.Agent.Client (AgentClient) import Simplex.Messaging.Agent.Env.SQLite (InitialAgentServers (..), ServerCfg, ServerRoles (..), presetServerCfg) import Simplex.Messaging.Agent.Protocol (AgentErrorType (..)) @@ -86,6 +86,34 @@ resolveNameTests = do it "surfaces as SMP host (NAME (RESOLVER ..))" testBackendError describe "success path" $ it "returns NameRecord" testDirectSuccess + describe "name availability" $ do + it "answers through the agent's own server selection" testAvailSuccess + it "answers NAME NO_RESOLVER when the chosen server has none" testAvailNoResolver + it "fails agent-side with NO_NAME_SERVERS when no server has the names role" testAvailNoNameServers + +testAvailSuccess :: HasCallStack => IO () +testAvailSuccess = + withDirectResolver (status404, "{\"error\":\"unregistered\"}") $ \c -> do + r <- runExceptT $ getSimplexNameAvailability c NRMInteractive 1 (SimplexDomain TLDSimplex "alice" []) + case r of + Right a -> a `shouldBe` SMP.NAVailable + _ -> expectationFailure $ "expected Right NAVailable, got: " <> show r + +testAvailNoResolver :: HasCallStack => IO () +testAvailNoResolver = + withNoResolver $ \c -> do + r <- runExceptT $ getSimplexNameAvailability c NRMInteractive 1 (SimplexDomain TLDSimplex "alice" []) + case r of + Left (SMP _ (SMP.NAME SMP.NO_RESOLVER)) -> pure () + _ -> expectationFailure $ "expected Left (SMP _ (NAME NO_RESOLVER)), got: " <> show r + +testAvailNoNameServers :: HasCallStack => IO () +testAvailNoNameServers = + withNoNameServers $ \c -> do + r <- runExceptT $ getSimplexNameAvailability c NRMInteractive 1 (SimplexDomain TLDSimplex "alice" []) + case r of + Left NO_NAME_SERVERS -> pure () + _ -> expectationFailure $ "expected Left NO_NAME_SERVERS, got: " <> show r testDirectNotFound :: HasCallStack => IO () testDirectNotFound = diff --git a/tests/SMPNamesTests.hs b/tests/SMPNamesTests.hs index 5ddc2e49d..13eb3a294 100644 --- a/tests/SMPNamesTests.hs +++ b/tests/SMPNamesTests.hs @@ -22,7 +22,7 @@ import Simplex.Messaging.Server.Main (validateUrl) import Simplex.Messaging.Server.Names ( NamesConfig (..), RpcAuth (..), - nameAvailability, + getNameAvailability, newNamesEnv, pingEndpoint, resolveName, @@ -149,12 +149,14 @@ availabilitySpec = do refuses status400 "{\"error\":\"tldNotConfigured\"}" (RESOLVER "tldNotConfigured") it "a TLD with no registrar, so status could not be read, is a resolver error" $ refuses status200 "{\"status\":\"unknown\",\"expires\":null}" (RESOLVER "unknown") + it "a status longer than the error carries is bounded, not passed through" $ + refuses status502 (jsonBody ("{\"error\":\"" <> replicate 400 'e' <> "\"}")) (RESOLVER (T.replicate 32 "e")) it "a body that is not the resolver's JSON is never NOT_FOUND" $ refuses status404 "gateway" (RESOLVER "HTTP 404") it "a body past the configured cap is a resolver error" $ withResolverServer (resolveResp status200 (jsonBody ("{\"status\":\"registered\",\"pad\":\"" <> replicate 400 'x' <> "\"}"))) $ \port _ -> do env <- newNamesEnv (testNamesConfig port) {resolverMaxResponseBytes = 200} - nameAvailability env navlDomain `shouldReturn` Left (RESOLVER "response too large") + getNameAvailability env navlDomain `shouldReturn` Left (RESOLVER "response too large") it "every answer survives the wire" $ mapM_ (\a -> smpDecode (smpEncode a) `shouldBe` Right a) @@ -177,7 +179,7 @@ availabilitySpec = do asks_ st body expected = withResolverServer (resolveResp st body) $ \port _ -> do env <- newNamesEnv (testNamesConfig port) - nameAvailability env navlDomain `shouldReturn` expected + getNameAvailability env navlDomain `shouldReturn` expected navlDomain = SimplexDomain {nameTLD = TLDSimplex, domain = "alice", subDomain = []} parseNameSpec :: Spec