From 822269ba580a319286090c5502f4e17bc99e4f34 Mon Sep 17 00:00:00 2001 From: AlteredCoder <64792091+AlteredCoder@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:24:30 +0000 Subject: [PATCH] Update python SDK v0.16.0 --- crowdsec_service_api/__init__.py | 3 +- .../__pycache__/__init__.cpython-311.pyc | Bin 5024 -> 4996 bytes .../__pycache__/base_model.cpython-311.pyc | Bin 4378 -> 4370 bytes .../__pycache__/http_client.cpython-311.pyc | Bin 7768 -> 7760 bytes .../__pycache__/models.cpython-311.pyc | Bin 158635 -> 158883 bytes crowdsec_service_api/models.py | 104 ++++---- .../__pycache__/__init__.cpython-311.pyc | Bin 207 -> 199 bytes .../__pycache__/allowlists.cpython-311.pyc | Bin 12917 -> 12909 bytes .../__pycache__/blocklists.cpython-311.pyc | Bin 15121 -> 15113 bytes .../services/__pycache__/cves.cpython-311.pyc | Bin 12321 -> 12356 bytes .../__pycache__/decisions.cpython-311.pyc | Bin 4338 -> 4330 bytes .../__pycache__/fingerprints.cpython-311.pyc | Bin 12310 -> 12345 bytes .../services/__pycache__/hub.cpython-311.pyc | Bin 3277 -> 3269 bytes .../services/__pycache__/info.cpython-311.pyc | Bin 2035 -> 2027 bytes .../__pycache__/integrations.cpython-311.pyc | Bin 8075 -> 8067 bytes .../__pycache__/metrics.cpython-311.pyc | Bin 2607 -> 2599 bytes .../__pycache__/products.cpython-311.pyc | Bin 3782 -> 3774 bytes .../tracker_events.cpython-311.pyc | Bin 2914 -> 2906 bytes .../__pycache__/tracker_tags.cpython-311.pyc | Bin 5698 -> 5690 bytes .../__pycache__/vendors.cpython-311.pyc | Bin 10351 -> 10343 bytes crowdsec_service_api/services/allowlists.py | 2 +- crowdsec_service_api/services/blocklists.py | 2 +- crowdsec_service_api/services/cves.py | 3 +- crowdsec_service_api/services/decisions.py | 2 +- crowdsec_service_api/services/fingerprints.py | 3 +- crowdsec_service_api/services/hub.py | 2 +- crowdsec_service_api/services/info.py | 2 +- crowdsec_service_api/services/integrations.py | 2 +- crowdsec_service_api/services/metrics.py | 2 +- crowdsec_service_api/services/products.py | 2 +- .../services/tracker_events.py | 2 +- crowdsec_service_api/services/tracker_tags.py | 2 +- crowdsec_service_api/services/vendors.py | 2 +- doc/Cves.md | 6 +- doc/Fingerprints.md | 6 +- doc/Models.md | 33 +-- doc/README.md | 4 +- public-openapi.json | 236 +++++++----------- pyproject.toml | 2 +- uv.lock | 20 +- 40 files changed, 184 insertions(+), 258 deletions(-) diff --git a/crowdsec_service_api/__init__.py b/crowdsec_service_api/__init__.py index f2c57ce..f47d3d3 100644 --- a/crowdsec_service_api/__init__.py +++ b/crowdsec_service_api/__init__.py @@ -138,7 +138,7 @@ class Server(Enum): 'Behavior', 'CVEEventOutput', 'CVEExploitationPhase', - 'CVEResponseBase', + 'CVEResponseDetailed', 'CVEsubscription', 'CWE', 'Classification', @@ -149,7 +149,6 @@ class Server(Enum): 'FacetBucket', 'FingerprintEventOutput', 'FingerprintRuleResponse', - 'FingerprintRuleSummary', 'FingerprintTimelineItem', 'GetCVEIPsResponsePage', 'GetCVEProtectRulesResponse', diff --git a/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc b/crowdsec_service_api/__pycache__/__init__.cpython-311.pyc index 2db00239d7de4999aa3c5ce54bc923355cb316a5..58dced2b0e842c271aaea2946afefdf9243a4d19 100644 GIT binary patch delta 129 zcmZ3W-lERCoR^o20SMa6EwdJFFDgsbO)SU+ z(v#OQWiW2oEY3WOLqym)%rz*rxFA2TIMpS!Br!85HD&Ta?rWRZ^W?BHUf3)nl*uSv T$i&U`fdN4_u!CTc4A4#hf-@)V delta 156 zcmZosU!cyroR^o20R&35vi5A`t!7e-)X&JzP1P?d&C5$I(vL6CFUruy zEXahiCof~lVBENwpLrIC0KapXYfx%&0Z>t@Q(|%IIJ=>r3TY+wh$A{n4-0M#inRR910 diff --git a/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc b/crowdsec_service_api/__pycache__/base_model.cpython-311.pyc index 98b9f58568825bc4f734f1e579444f5920d5390c..12289f525a6297dd823581becc06dc6602a64156 100644 GIT binary patch delta 56 zcmbQGG)akjIWI340}zy&TW;i5W|j-q&&bbB)h{Z|%S$cNk1x+J%GNI`OVv#*$OO`x JLzs{80syi65l8?4 delta 64 zcmbQFG)swlIWI340}wnd(b~wZ%&ZozpOK%Ns$W!^mzP?kA77qdl&znfpI4lpld79o NkO^gP_F+E83jlAr6*>R_ diff --git a/crowdsec_service_api/__pycache__/http_client.cpython-311.pyc b/crowdsec_service_api/__pycache__/http_client.cpython-311.pyc index 1bc5815900c09dcc5d59b8b7d1636dda5e5ee5f9..775765c6e344bf9d536221c0ca72669f0ef35727 100644 GIT binary patch delta 56 zcmca%bHRptIWI340}zy&TW;h&$0!$~pOK%Ns$W!^mzP?kA77qdl&xP>ma3arkO`zW J|7VPp0RZx@672v0 delta 64 zcmca$bHj#vIWI340}wnd(b~v;j!`W}KO;XkRlle-FE6!7KfXM_C|f@{Kd(4HCsjAG NAQQ^o{GBmU1^~M}7T*8> diff --git a/crowdsec_service_api/__pycache__/models.cpython-311.pyc b/crowdsec_service_api/__pycache__/models.cpython-311.pyc index 6ec2ace3e093ffc22a4a8f92ab2f5aa7fa9fef13..2a8260cd3af2c8c82bc8e7d9eb03ace95a91437e 100644 GIT binary patch delta 14681 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 delta 14403 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 diff --git a/crowdsec_service_api/models.py b/crowdsec_service_api/models.py index d2625ae..52564e6 100644 --- a/crowdsec_service_api/models.py +++ b/crowdsec_service_api/models.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: -# timestamp: 2026-06-11T08:42:40+00:00 +# timestamp: 2026-06-22T13:24:22+00:00 from __future__ import annotations @@ -1380,7 +1380,7 @@ class BlocklistsUploadBlocklistContentQueryParameters(BaseModelSdk): Optional[datetime], Field( description='Blocklist expiration', - examples=['2026-06-11T08:40:13.370581+00:00'], + examples=['2026-06-19T08:54:44.914456+00:00'], title='Expiration', ), ] = None @@ -1749,6 +1749,14 @@ class CvesGetCvesQueryParameters(BaseModelSdk): title='Exploitation Phase', ), ] = None + detailed: Annotated[ + Optional[bool], + Field( + description='Include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE in the list. Defaults to false to keep the response lightweight.', + examples=[True], + title='Detailed', + ), + ] = False page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') ] = 1 @@ -2177,6 +2185,14 @@ class FingerprintsGetFingerprintRulesQueryParameters(BaseModelSdk): title='Sort Order', ), ] = 'desc' + detailed: Annotated[ + Optional[bool], + Field( + description='Include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each fingerprint rule in the list. Defaults to false to keep the response lightweight.', + examples=[True], + title='Detailed', + ), + ] = False page: Annotated[ Optional[int], Field(description='Page number', ge=1, title='Page') ] = 1 @@ -3728,7 +3744,7 @@ class ScenarioIndex(BaseModelSdk): ] = None -class CVEResponseBase(BaseModelSdk): +class CVEResponseDetailed(BaseModelSdk): id: Annotated[str, Field(description='ID of the CVE', title='Id')] name: Annotated[str, Field(description='Name of the CVE', title='Name')] title: Annotated[str, Field(description='Title of the CVE', title='Title')] @@ -3808,6 +3824,29 @@ class CVEResponseBase(BaseModelSdk): description='Threat context (attacker/defender countries, industries, objectives)' ), ] = None + tags: Annotated[ + Optional[List[str]], + Field(description='Tags associated with the CVE', title='Tags'), + ] = None + references: Annotated[ + Optional[List[str]], + Field(description='List of references for the CVE', title='References'), + ] = None + description: Annotated[ + Optional[str], Field(description='Description of the CVE', title='Description') + ] = None + crowdsec_analysis: Annotated[ + Optional[str], + Field(description='CrowdSec analysis of the CVE', title='Crowdsec Analysis'), + ] = None + cwes: Annotated[ + Optional[List[CWE]], + Field(description='List of CWEs associated with the CVE', title='Cwes'), + ] = None + events: Annotated[ + Optional[List[CVEEventOutput]], + Field(description='List of events related to the CVE', title='Events'), + ] = None class FingerprintRuleResponse(BaseModelSdk): @@ -3892,61 +3931,6 @@ class FingerprintRuleResponse(BaseModelSdk): ] = None -class FingerprintRuleSummary(BaseModelSdk): - id: Annotated[str, Field(description='Fingerprint rule identifier', title='Id')] - name: Annotated[str, Field(description='Fingerprint rule name', title='Name')] - title: Annotated[str, Field(description='Fingerprint rule title', title='Title')] - affected_components: Annotated[ - List[AffectedComponent], - Field(description='List of affected components', title='Affected Components'), - ] - crowdsec_score: Annotated[ - int, - Field( - description='Live Exploit Tracker score for the fingerprint rule', - ge=0, - le=10, - title='Crowdsec Score', - ), - ] - opportunity_score: Annotated[ - Optional[int], - Field(description='Opportunity score', ge=0, le=5, title='Opportunity Score'), - ] = 0 - momentum_score: Annotated[ - Optional[int], - Field(description='Momentum score', ge=0, le=5, title='Momentum Score'), - ] = 0 - first_seen: Annotated[ - Optional[datetime], Field(description='First seen date', title='First Seen') - ] = None - last_seen: Annotated[ - Optional[datetime], Field(description='Last seen date', title='Last Seen') - ] = None - nb_ips: Annotated[ - int, Field(description='Number of unique IPs observed', ge=0, title='Nb Ips') - ] - rule_release_date: Annotated[ - Optional[datetime], - Field( - description='Release date of the fingerprint rule', - title='Rule Release Date', - ), - ] = None - exploitation_phase: Annotated[ - ExploitationPhase, Field(description='Current exploitation phase') - ] - adjustment_score: Annotated[ - Optional[AdjustmentScore], Field(description='Score adjustment details') - ] = None - threat_context: Annotated[ - Optional[ThreatContext], - Field( - description='Threat context (attacker/defender countries, industries, objectives)' - ), - ] = None - - class GetCVEResponse(BaseModelSdk): id: Annotated[str, Field(description='ID of the CVE', title='Id')] name: Annotated[str, Field(description='Name of the CVE', title='Name')] @@ -4062,7 +4046,7 @@ class GetCVESubscribedIntegrationsResponsePage(BaseModelSdk): class GetCVEsResponsePage(BaseModelSdk): - items: Annotated[List[CVEResponseBase], Field(title='Items')] + items: Annotated[List[CVEResponseDetailed], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] size: Annotated[int, Field(ge=1, title='Size')] @@ -4071,7 +4055,7 @@ class GetCVEsResponsePage(BaseModelSdk): class GetFingerprintRulesResponsePage(BaseModelSdk): - items: Annotated[List[FingerprintRuleSummary], Field(title='Items')] + items: Annotated[List[FingerprintRuleResponse], Field(title='Items')] total: Annotated[int, Field(ge=0, title='Total')] page: Annotated[int, Field(ge=1, title='Page')] size: Annotated[int, Field(ge=1, title='Size')] diff --git a/crowdsec_service_api/services/__pycache__/__init__.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/__init__.cpython-311.pyc index 03cc6cd2b678c4bb7fde146020819a3126108035..a74b0ed3b1c9ca7348849d7762a097e10a68d5d8 100644 GIT binary patch delta 38 scmX@lc$|@YIWI340}zy&TTbLQWsI8WD9lw{7o(q%pPQ;*RGOEUTBILeo?n!$ TUsRT=n^=$uq&Gij?$ZMRrQsFn delta 74 zcmaEx@->BfIWI340|=CAZRCz+W;N6^G_shS%N(MXqMwnUo2p+_nwOVaq#s|NUzDw% WoS#>mpOdPaSda;2Z@$mmrw0H-4H%^W diff --git a/crowdsec_service_api/services/__pycache__/blocklists.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/blocklists.cpython-311.pyc index d87cdb1bac7f4880ebeb44a85f3d6e4d5ffdd4cb..3a654823e59aaf5c9b7132a89748552dc5ed9c6b 100644 GIT binary patch delta 66 zcmbPO)>+2AoR^o20SMa6EjM!CWo9ii&@(if{FXUHE=E5iKQ~pss5CDxwMaj{JijPg Tzo;x#H?bfSNN-MOS!D(QrQ8+j delta 74 zcmeAyn^?xZoR^o20R&35Hgex(W;N6^G_sidmN`T%ML#1yH&wr=G%qi;NI$+jzbIQj WIX|yBKPOc;u^ zb#tvl9BvOz!LHQWZ=T*K>`h1yvib-*bzB~?!w&g&;t>SQu-Yf7fB z^YWzaKVA>q4crd=96HEg@PNT#mheYAG)Lb0w1>) zF{*iOMDV0c)DL&PJv6|4coR}+h7=k##}d=hK*JC%bWu7@Cd1=WEH3u$_*uWWE784I5P72c#pJ8Gd6wj- zvRTHH)34|FYe~Myx@PiexQes#$K)B|)em}1loe*u8AeNTe&!@A$qVT>*sMuZY)*>> z9`R*~l4X;)WNOlz)6%jTLhS(?wKvxVtXJX6|{$<6Xz zVCPAM1bUb_Tgd0K3v9s(G$>Y#eX>*Xwuq}yPw}?#C*qHz?@ol>05KEagX$iJawy3KcDlfEw_Aj5QF5d>W*gD9ZdBEcnQEn(HS#-71-^hhf`CnaT)oE~BP3P)%(0?-xQ&~&4!IJb^`@(9UF)jLAKuVz?o8VeE zr(qe>^DgWO&Q^8Gv>DK*MeDI~Q;#qCyYW#C!uyh2D8wwh5%*yru4S`T;U!~!=1e9x zLt&=$furQx;#5HWUynCyU1;e=t)7yBvJ5M*n7OK^2{Dx1N)1FRE{~`Wj*?%B$AZH; zLv?z@gN`BjOTu@HJ8fz5kC+JcIv(+kd=!dRyWS=~2|2~@A=^N8qCj)KWG#shCNZ~7 zCXw(k`JB%o<}8m zD-wYzG)6mmH}b1((jvy#rb%a_QF32=8olQjL+>C$D?p6!F|itJAnoE>EI%s0lFPvd z3BF8x0A2PY97GsK7(p0Ccpl*h!Z^Z92uBf)BTR{t@vwp7GA-VZcQ$8nc?zJUjHk1+ z>`=athOZkxgZ3p+itiz_!rHlb&ewd?>ALB3m+fBtFeyujw{4y)JKkL`>ot=>ax`A) zTC+#XMva>!SKvmVYt5M`n>B+)3bfy7?_cu|lc}E$eYvRdGmW zf4Kpz&Z^=j>?xXe&gn>xC?w9-Yfk__^c?>rz=%Cac!?0+F3T2zpT&VQ(VKFL_BaG3@6{h&b>)QczRCHD^&fL7)R-cWxRhF*mf-1u-6xv0p?rGkE7rYB!wv z)E?HUx|W#)HTj{0E)f_Iycc*kNJNFt#(LBsl;mfDX4g#%`t-BjCI^8K2n5C5J{A(^ zeJ$q(bqD0%afzIxGy3pxqQv+_+xPlpJh^)xH%ce^XA|><1(whj^LeHvPQ6{w-b`c) z`BEXrhSJ6Cy3Nl^*SJqVE=$Gq8>}XkvhT2rk-ukh^Ci8R8u@LxM{mlKB{RR?8`c}L zq+S@bw zkI6r88`zNlnk_^RLWXHNSvAVH9&`JSz2DnX9aK}3%IsWO!xUaV?1<5$)sv1XU0<`w zr?6(xsd+=ED^7)u^1IF$U-esf$kiJceLj!j{RmNnZQ9PcrYNg^>-tdl=twsT&3fV> zblEc`gjPJAk*3f#>CeV|+~*ym?^cg_FFi>^e|L_6PO=LgA~aO!N-9F%JS$;kmrycx@=$_3=yBm!{ zY2H{rmNuxE8)FxxE#mcUC-OA?hu@6--v1m%h7kGy6sn;^(Y3l>P$GOqDIRQt*O0a! zLnjfQK{$l)EW#AR5rm@%#}Hmdcm?4k!t1;;5HV!XoaZ+NcJ(fxSq7-tj%V{3_F}P| zg;$w&4*eJSy@6r+5)bcsYuWAj+3l@6eEJlv6U1K}zN>8?EYLw3a?OUXw`{9xOP_u z2hZr}FuxMNposS+zP>dl0&b2LK)@&Wz%;Q?P#1ITfc6m|Puw~(CDDUW`PTm~?fs*1 K`qwr=Lf~I+LA^l$ diff --git a/crowdsec_service_api/services/__pycache__/decisions.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/decisions.cpython-311.pyc index d705642e1226909db262b964ed97acbc6e614089..501e9e7e857e48ee47fc7778fc30c872ca164b5a 100644 GIT binary patch delta 66 zcmeyQ_)3v`IWI340}!;CTW;hQVP-8e&@(iftil{37ppPQ;*RGOEUTBILeo?n!$ TUsRT=n^=$uq&LrF4&em=XfPBe delta 74 zcmaE*_(_p_IWI340|=CAZR8eVW;N6^G_shi!W^QOte=seo2p+_nwOVaq#s|NUzDw% WoS#>mpOdPaSda;2Z=S{+!V3WWRTkm^ diff --git a/crowdsec_service_api/services/__pycache__/fingerprints.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/fingerprints.cpython-311.pyc index 43a3794d6559f7bed7b0eeec2036e4ad35245093..88a0acf51f23e1f12e77c24d0a87931927fc2d7d 100644 GIT binary patch delta 2285 zcma)6Z){Ul6o0pUZC_ve+O_MSbz4Wrwr+3#x<9au0pesV0V5*+vJAo~ygMkCw%&Fy zU~_yhYSbXfO@I%6FfmH-PmEMQ=m(=;G%=9?A(1rE$oFYV@EeKooLgC2n8Vk+U(Y%B z+;e{Sob&Fb!(SiPu428}gTS)_Fp=aOlN)|Yh%8iAk<%bPUXXf(q)LNr|VDob#b z5N#^!uzxM=Un3IAGyWP-1?w69kTnu{lr)F{ZA_%T|Lvx&3xsBO80l7zAu z-Uli){<36{1slJqG+2~`v|#63+FLBvgfy@4?;IN~D%c!6)6f#L%{%7RdHbjGN3tY+ z0&nSAaONHj5*Q4tVVRc_WZuc|w|DU~*58Q6Cv8o`tQ}ShPMR_@=|n0wJb25FD z#lX&b5qi)=VKkdbr?NDwfg0ggZIi@%UAaXXb@b^%=m*dhHh}UV!aDwkeTbj;+XvVP z=mj}P=W^E+R*#F%AdDhxM5xZkHt|F1exm2UQumpf%PIQMRphZ(<#Dw|`14xGIt1&5 z0Y2uh=Q}i&U(npvVcaspKhQdRMapfcM-lMot1)<}O_R;}1FrWf89bRBq7+7!Q*QG3 zODu+$P3Jtmi4qHRb#KpP$HgdQ_vGTatZuKUhak5~Q7$$H`I2WhnapqTUNS|WS{O{Y z1&H+VE`JRf;+y>Ajxv=#{(`@ifA06`qB8%hC`P?$p0_$ETc(^9Zy z;%AcSxB+9cSny8Z=3Bw5k&aG3%F$58DfS#(AOZeU#|Zh8oAocFvS!ElMln#o_y6<*)x(XJLr; E4^P40NdN!< delta 2217 zcma)6Z){Ul6u-B7eQjU+)<0{vb!$fpYuOuH+l`FD#$qOwK#a@yr=*fV!@GrIY3q9( zATq}X48~|;a*~0GL_Zh}5kF{+313KvCh8|45@SkC@QYv6q(;Bt2k*I^Ys;VEYx;ZV zoO|v$zkANP@A{GDBkIShst|k@hEK#lQ`59x6)GWreMCALUb3`dJkoJ8aea)xH2`-rx&=GvJr9%C@k@r`vXF*d#xsI)(xOCB$sWJzP8 zSY$@>@adBAQu1i2XqF0WG+WNE$Y4sJLe#oZmCD&;tR|WHv+Sr0H|>5!;a$E&bh;?R zp00kYEl(Eh@N(BiYJ=~c(^d!96zSvf$RaMP85 z*X6s^1zFnwT(J4W3GQKxB8+gT*$rlvIW=awxC&p|4pL9mZNE)JL+CS%km8`(jWLwR z5jMj=jxEy@C~iTR`djV-RMKh48k^qDTMZ<#x$H%o~J|AuayIqXfsa|T}3iS zTe5I00vRz&!zJhyvy*-W!aHeWFJRk9URbF`E|@L7Y!`=K7V@7+sZsLuJ8 zE%7JT0_i-(>7-yPfK;9hq@7JFDL51ugc||BCW`UD>To}BN-guS<}V!1le!CTDSjyW zY}I$W`z$l_+`8Woybf?tvl^TDOUzDVibQM0REXl)+B#S7olUQfNlhx3%!;No%7f9? z9+R4_oPDKG%IbVx7J_B^X7$%#zvaQXY)=>tJu}lxDC?}iDy*#|FJj&`J93(SSnUZP zu*i*WKx}Y_bd?$@xV~=T&8qX+5r>QeNB7AEO2o$u0U&AYp(=Z|J9C1Y2mQl8INjvG0?Vp=#vB1Q;f=Q*66 zhS|;m2*n+6bI?zJgC7SUNk1Ih)_T9T#}qgpdmQ}@82u!|8io8Wc8LB^jmP5;U9h&o z@hG(sQL>9eUD|5z8sC&2@pU!IM!s0tyHH?zS3Xw8EPORINB;ny_CP{iLP;5l%B#xoFTUbTVM(7nx`K;l4f!?~6zpLqyJr+6+ t%ZXP#V))!h(2J0QXtI~S4O7V*vt|dKs*^|KJClEkmA@aeZiIQXe*x3I$L9b5 diff --git a/crowdsec_service_api/services/__pycache__/hub.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/hub.cpython-311.pyc index 9c5bafe5e48a74bcc5b7523b7ea994a416066e27..0d822cdbe0461da9b14e2a35cc80aca8b222bbc6 100644 GIT binary patch delta 66 zcmX>rc~p{nIWI340}!;CTW;j8U}7yZ&@(if+`$wg7pk9;pPQ;*RGOEUTBILeo?n!$ TUsRT=n^=$uq&G7$pXLMraJ3X; delta 74 zcmX>qc~+8pIWI340|=CAZRDmpOdPaSda;2Z~nz}niBvF78o7? diff --git a/crowdsec_service_api/services/__pycache__/info.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/info.cpython-311.pyc index 0cca044724879ad51a383a04a974b9abcb753622..cf128d13c1ff9db02e2b3cd73bd9ad34e22b7019 100644 GIT binary patch delta 66 zcmey&|C*nBIWI340}!;CTW;hIWnwKe&@(ifoXQj;7p9+)pPQ;*RGOEUTBILeo?n!$ TUsRT=n^=$uq&MGZ5@7`Zbv_h# delta 74 zcmaFO|CyhAIWI340|=CAZR8GRVl~t=G_shS$`qm&r=O9Zo2p+_nwOVaq#s|NUzDw% WoS#>mpOdPaSda;2Z@$hX!U_NkIu|nl diff --git a/crowdsec_service_api/services/__pycache__/integrations.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/integrations.cpython-311.pyc index 53c1b9a9ec792af93fa36c27f740d87492cd99cb..f0a7384e0dd8a093d72c23346f5c25e579dcda8f 100644 GIT binary patch delta 66 zcmeCSZ?@-N&dbZi00eF3mK(X%nOVyW^bE}=n=^;V#p!3{=ceixmFDH87U{>A=NDz` T7nP;zCKhA@>CGFNZ%G3HOC}U# delta 74 zcmZp+@3!Y&&dbZi00O028@bh)Sq=3JjVvacGl!_9>1X8Urs@}!=H;ap>BpDn7iH@w W=jRpY=cMW;7Gy%%n^!X5k_G_W0~a6w diff --git a/crowdsec_service_api/services/__pycache__/metrics.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/metrics.cpython-311.pyc index 3dd88f559c910ce5387a7850a10836d8cccbb337..52a5b829beb8276e7a26199ce28daaa7604e8125 100644 GIT binary patch delta 66 zcmZ24vRs6FIWI340}!;CTW;i@!Ngi-pl4_{c?DC5T%>+Rer~FMQE6UYYLR|?d45s0 TeoK#Xk;;Y1yhJxqJBnxZmND!XmyHA#TIWI340}!;CTW;jO&%|10pl4_{`8`vJT$FxBer~FMQE6UYYLR|?d45s0 TeoK#Xk;<@JyVEUl72>hZmND!XK#Xk;<@4pRtY#$-cgVWH&wyyEmpOdPaSda;2Z~n&YA_M>rx)-nj diff --git a/crowdsec_service_api/services/__pycache__/vendors.cpython-311.pyc b/crowdsec_service_api/services/__pycache__/vendors.cpython-311.pyc index d4f743a50282e1bb623c56cac65a0e44cf40b373..7ce1a64ef2e6bbeeab0fc6564fa4dce88f076a14 100644 GIT binary patch delta 66 zcmaDK@H~KfIWI340}!;CTW;h&#>`q~pl4_{`5JSGT%>+Rer~FMQE6UYYLR|?d45s0 Teo None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def list_allowlists( self, diff --git a/crowdsec_service_api/services/blocklists.py b/crowdsec_service_api/services/blocklists.py index ac2cad5..3a75994 100644 --- a/crowdsec_service_api/services/blocklists.py +++ b/crowdsec_service_api/services/blocklists.py @@ -11,7 +11,7 @@ class Blocklists(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_blocklists( self, diff --git a/crowdsec_service_api/services/cves.py b/crowdsec_service_api/services/cves.py index 6d90155..de29a81 100644 --- a/crowdsec_service_api/services/cves.py +++ b/crowdsec_service_api/services/cves.py @@ -11,7 +11,7 @@ class Cves(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_cves( self, @@ -19,6 +19,7 @@ def get_cves( sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), exploitation_phase: Optional[CVEExploitationPhase] = None, + detailed: bool = False, page: int = 1, size: int = 50, )-> GetCVEsResponsePage: diff --git a/crowdsec_service_api/services/decisions.py b/crowdsec_service_api/services/decisions.py index 7468e0a..5d697f8 100644 --- a/crowdsec_service_api/services/decisions.py +++ b/crowdsec_service_api/services/decisions.py @@ -11,7 +11,7 @@ class Decisions(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_decisions( self, diff --git a/crowdsec_service_api/services/fingerprints.py b/crowdsec_service_api/services/fingerprints.py index 1bc0b40..7d3fc57 100644 --- a/crowdsec_service_api/services/fingerprints.py +++ b/crowdsec_service_api/services/fingerprints.py @@ -11,13 +11,14 @@ class Fingerprints(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_fingerprint_rules( self, query: Optional[str] = None, sort_by: Optional[GetCVEsSortBy] = GetCVEsSortBy("rule_release_date"), sort_order: Optional[GetCVEsSortOrder] = GetCVEsSortOrder("desc"), + detailed: bool = False, page: int = 1, size: int = 50, )-> GetFingerprintRulesResponsePage: diff --git a/crowdsec_service_api/services/hub.py b/crowdsec_service_api/services/hub.py index 3a1546e..25aa7ee 100644 --- a/crowdsec_service_api/services/hub.py +++ b/crowdsec_service_api/services/hub.py @@ -11,7 +11,7 @@ class Hub(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_index( self, diff --git a/crowdsec_service_api/services/info.py b/crowdsec_service_api/services/info.py index c5b2050..be83b5c 100644 --- a/crowdsec_service_api/services/info.py +++ b/crowdsec_service_api/services/info.py @@ -11,7 +11,7 @@ class Info(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_info( self, diff --git a/crowdsec_service_api/services/integrations.py b/crowdsec_service_api/services/integrations.py index 73f5656..837a21c 100644 --- a/crowdsec_service_api/services/integrations.py +++ b/crowdsec_service_api/services/integrations.py @@ -11,7 +11,7 @@ class Integrations(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_integrations( self, diff --git a/crowdsec_service_api/services/metrics.py b/crowdsec_service_api/services/metrics.py index 322c7c5..f478bc0 100644 --- a/crowdsec_service_api/services/metrics.py +++ b/crowdsec_service_api/services/metrics.py @@ -11,7 +11,7 @@ class Metrics(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_metrics_remediation( self, diff --git a/crowdsec_service_api/services/products.py b/crowdsec_service_api/services/products.py index 5d173fc..02fb35c 100644 --- a/crowdsec_service_api/services/products.py +++ b/crowdsec_service_api/services/products.py @@ -11,7 +11,7 @@ class Products(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_products( self, diff --git a/crowdsec_service_api/services/tracker_events.py b/crowdsec_service_api/services/tracker_events.py index fa41f55..d5f7311 100644 --- a/crowdsec_service_api/services/tracker_events.py +++ b/crowdsec_service_api/services/tracker_events.py @@ -11,7 +11,7 @@ class TrackerEvents(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_exploitation_phase_change_events( self, diff --git a/crowdsec_service_api/services/tracker_tags.py b/crowdsec_service_api/services/tracker_tags.py index 270d8f4..d66a87d 100644 --- a/crowdsec_service_api/services/tracker_tags.py +++ b/crowdsec_service_api/services/tracker_tags.py @@ -11,7 +11,7 @@ class TrackerTags(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_tags( self, diff --git a/crowdsec_service_api/services/vendors.py b/crowdsec_service_api/services/vendors.py index dab3932..57cb465 100644 --- a/crowdsec_service_api/services/vendors.py +++ b/crowdsec_service_api/services/vendors.py @@ -11,7 +11,7 @@ class Vendors(Service): def __init__(self, auth: Auth, base_url: str = "https://admin.api.crowdsec.net/v1") -> None: - super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/1.128.0") + super().__init__(base_url=base_url, auth=auth, user_agent="crowdsec_service_api/v0.16.0") def get_vendors( self, diff --git a/doc/Cves.md b/doc/Cves.md index 9b8a39b..a0e497f 100644 --- a/doc/Cves.md +++ b/doc/Cves.md @@ -3,7 +3,7 @@ # Cves Methods | Method | Description | | ------ | ----------- | -| [get_cves](#get_cves) | Get a paginated list of CVEs that CrowdSec is tracking | +| [get_cves](#get_cves) | Get a paginated list of CVEs that CrowdSec is tracking. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE; they are omitted by default to keep the list light. | | [get_cve](#get_cve) | Get information about a specific CVE ID | | [get_cve_protect_rules](#get_cve_protect_rules) | Get protection/detection rules associated with a specific CVE ID | | [download_cve_ips](#download_cve_ips) | Download the list of IPs exploiting a specific CVE ID in raw format | @@ -16,7 +16,7 @@ | [get_cve_timeline](#get_cve_timeline) | Get timeline data of occurrences for a specific CVE ID | ## **get_cves** -### Get a paginated list of CVEs that CrowdSec is tracking +### Get a paginated list of CVEs that CrowdSec is tracking. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE; they are omitted by default to keep the list light. - Endpoint: `/cves` - Method: `GET` @@ -27,6 +27,7 @@ | sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | | sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | | exploitation_phase | Optional[CVEExploitationPhase] | Filter by exploitation phase | False | None | +| detailed | bool | Include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE in the list. Defaults to false to keep the response lightweight. | False | False | | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: @@ -51,6 +52,7 @@ try: sort_by=rule_release_date, sort_order=desc, exploitation_phase=None, + detailed=True, page=1, size=50, ) diff --git a/doc/Fingerprints.md b/doc/Fingerprints.md index addb9a3..c804f4b 100644 --- a/doc/Fingerprints.md +++ b/doc/Fingerprints.md @@ -3,7 +3,7 @@ # Fingerprints Methods | Method | Description | | ------ | ----------- | -| [get_fingerprint_rules](#get_fingerprint_rules) | Get a paginated list of fingerprint rules | +| [get_fingerprint_rules](#get_fingerprint_rules) | Get a paginated list of fingerprint rules. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each rule; they are omitted by default to keep the list light. | | [download_fingerprint_ips](#download_fingerprint_ips) | Download the list of IPs exploiting a specific fingerprint rule in raw format | | [get_fingerprint_ips_details](#get_fingerprint_ips_details) | Get detailed information about IPs exploiting a specific fingerprint rule | | [get_fingerprint_ips_details_stats](#get_fingerprint_ips_details_stats) | Get aggregated statistics about IPs exploiting a specific fingerprint rule | @@ -15,7 +15,7 @@ | [get_fingerprint_rule](#get_fingerprint_rule) | Get information about a specific fingerprint rule | ## **get_fingerprint_rules** -### Get a paginated list of fingerprint rules +### Get a paginated list of fingerprint rules. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each rule; they are omitted by default to keep the list light. - Endpoint: `/fingerprints` - Method: `GET` @@ -25,6 +25,7 @@ | query | Optional[str] | Search query for fingerprint rules | False | None | | sort_by | Optional[GetCVEsSortBy] | Field to sort by | False | GetCVEsSortBy("rule_release_date") | | sort_order | Optional[GetCVEsSortOrder] | Sort order: ascending or descending | False | GetCVEsSortOrder("desc") | +| detailed | bool | Include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each fingerprint rule in the list. Defaults to false to keep the response lightweight. | False | False | | page | int | Page number | False | 1 | | size | int | Page size | False | 50 | ### Returns: @@ -48,6 +49,7 @@ try: query=None, sort_by=rule_release_date, sort_order=desc, + detailed=True, page=1, size=50, ) diff --git a/doc/Models.md b/doc/Models.md index b6ab9c0..7726c62 100644 --- a/doc/Models.md +++ b/doc/Models.md @@ -1107,7 +1107,7 @@ name, date, description, label, sorting_priority ## Enum: INSUFFICIENT_DATA, EARLY_EXPLOITATION, FRESH_AND_POPULAR, TARGETED_EXPLOITATION, MASS_EXPLOITATION, BACKGROUND_NOISE, UNPOPULAR, WEARING_OUT, UNCLASSIFIED -# **CVEResponseBase** +# **CVEResponseDetailed** ## Required: id, name, title, affected_components, crowdsec_score, nb_ips, published_date, has_public_exploit, exploitation_phase ## Properties @@ -1130,6 +1130,12 @@ id, name, title, affected_components, crowdsec_score, nb_ips, published_date, ha | exploitation_phase | ExploitationPhase | None || | adjustment_score | Optional[AdjustmentScore] | Score adjustments applied to the CVE score based on various factors || | threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || +| tags | list[str] | Tags associated with the CVE || +| references | list[str] | List of references for the CVE || +| description | Optional[str] | Description of the CVE || +| crowdsec_analysis | Optional[str] | CrowdSec analysis of the CVE || +| cwes | list[CWE] | List of CWEs associated with the CVE || +| events | list[CVEEventOutput] | List of events related to the CVE || # **CVEsubscription** ## Required: @@ -1249,27 +1255,6 @@ id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase | crowdsec_analysis | Optional[str] | CrowdSec analysis for this fingerprint rule || | events | list[FingerprintEventOutput] | List of events related to the fingerprint rule || -# **FingerprintRuleSummary** -## Required: -id, name, title, affected_components, crowdsec_score, nb_ips, exploitation_phase -## Properties -| Property | Type | Description | Example | -|----------|------|-------------|---------| -| id | str | Fingerprint rule identifier || -| name | str | Fingerprint rule name || -| title | str | Fingerprint rule title || -| affected_components | list[AffectedComponent] | List of affected components || -| crowdsec_score | int | Live Exploit Tracker score for the fingerprint rule || -| opportunity_score | int | Opportunity score || -| momentum_score | int | Momentum score || -| first_seen | Optional[str] | First seen date || -| last_seen | Optional[str] | Last seen date || -| nb_ips | int | Number of unique IPs observed || -| rule_release_date | Optional[str] | Release date of the fingerprint rule || -| exploitation_phase | ExploitationPhase | None || -| adjustment_score | Optional[AdjustmentScore] | Score adjustment details || -| threat_context | Optional[ThreatContext] | Threat context (attacker/defender countries, industries, objectives) || - # **FingerprintTimelineItem** ## Required: timestamp, count @@ -1347,7 +1332,7 @@ items, total, page, size, pages, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| -| items | list[CVEResponseBase] | None || +| items | list[CVEResponseDetailed] | None || | total | int | None || | page | int | None || | size | int | None || @@ -1381,7 +1366,7 @@ items, total, page, size, pages, links ## Properties | Property | Type | Description | Example | |----------|------|-------------|---------| -| items | list[FingerprintRuleSummary] | None || +| items | list[FingerprintRuleResponse] | None || | total | int | None || | page | int | None || | size | int | None || diff --git a/doc/README.md b/doc/README.md index 445188f..3ce5945 100644 --- a/doc/README.md +++ b/doc/README.md @@ -249,7 +249,7 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [CVEExploitationPhase](./Models.md#cveexploitationphase) -[CVEResponseBase](./Models.md#cveresponsebase) +[CVEResponseDetailed](./Models.md#cveresponsedetailed) [CVEsubscription](./Models.md#cvesubscription) @@ -271,8 +271,6 @@ You can find a Quickstart about this SDK, following this [documentation](https:/ [FingerprintRuleResponse](./Models.md#fingerprintruleresponse) -[FingerprintRuleSummary](./Models.md#fingerprintrulesummary) - [FingerprintTimelineItem](./Models.md#fingerprinttimelineitem) [GetCVEIPsResponsePage](./Models.md#getcveipsresponsepage) diff --git a/public-openapi.json b/public-openapi.json index 2e5d94e..c31a4a7 100644 --- a/public-openapi.json +++ b/public-openapi.json @@ -3,7 +3,7 @@ "info": { "title": "Service API", "description": "This is the API to manage Crowdsec services", - "version": "1.70.29", + "version": "1.70.35", "contact": { "name": "CrowdSec", "url": "https://crowdsec.net", @@ -1270,7 +1270,7 @@ ], "description": "Blocklist expiration", "examples": [ - "2026-06-11T08:40:13.370581+00:00" + "2026-06-19T08:54:44.914456+00:00" ], "title": "Expiration" }, @@ -3110,7 +3110,7 @@ "Cves" ], "summary": "Get list of CVEs CrowdSec is tracking", - "description": "Get a paginated list of CVEs that CrowdSec is tracking", + "description": "Get a paginated list of CVEs that CrowdSec is tracking. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE; they are omitted by default to keep the list light.", "operationId": "getCves", "parameters": [ { @@ -3199,6 +3199,21 @@ }, "description": "Filter by exploitation phase" }, + { + "name": "detailed", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE in the list. Defaults to false to keep the response lightweight.", + "examples": [ + true + ], + "default": false, + "title": "Detailed" + }, + "description": "Include the heavy detail fields (description, crowdsec_analysis, cwes, references, events, tags) for each CVE in the list. Defaults to false to keep the response lightweight." + }, { "name": "page", "in": "query", @@ -5139,7 +5154,7 @@ "Fingerprints" ], "summary": "Get list of fingerprint rules", - "description": "Get a paginated list of fingerprint rules", + "description": "Get a paginated list of fingerprint rules. Pass detailed=true to also include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each rule; they are omitted by default to keep the list light.", "operationId": "getFingerprintRules", "parameters": [ { @@ -5207,6 +5222,21 @@ }, "description": "Sort order: ascending or descending" }, + { + "name": "detailed", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each fingerprint rule in the list. Defaults to false to keep the response lightweight.", + "examples": [ + true + ], + "default": false, + "title": "Detailed" + }, + "description": "Include the heavy detail fields (description, crowdsec_analysis, references, events, tags) for each fingerprint rule in the list. Defaults to false to keep the response lightweight." + }, { "name": "page", "in": "query", @@ -11278,7 +11308,7 @@ ], "title": "CVEExploitationPhase" }, - "CVEResponseBase": { + "CVEResponseDetailed": { "properties": { "id": { "type": "string", @@ -11421,6 +11451,62 @@ } ], "description": "Threat context (attacker/defender countries, industries, objectives)" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags", + "description": "Tags associated with the CVE" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "List of references for the CVE" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Description of the CVE" + }, + "crowdsec_analysis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Crowdsec Analysis", + "description": "CrowdSec analysis of the CVE" + }, + "cwes": { + "items": { + "$ref": "#/components/schemas/CWE" + }, + "type": "array", + "title": "Cwes", + "description": "List of CWEs associated with the CVE" + }, + "events": { + "items": { + "$ref": "#/components/schemas/CVEEventOutput" + }, + "type": "array", + "title": "Events", + "description": "List of events related to the CVE" } }, "type": "object", @@ -11435,8 +11521,8 @@ "has_public_exploit", "exploitation_phase" ], - "title": "CVEResponseBase", - "description": "GET CVE ID Response" + "title": "CVEResponseDetailed", + "description": "List item able to carry the heavy detail fields.\n\nThe list endpoint only populates these when ``detailed=true`` is passed;\notherwise they are left unset and stripped from the response via\n``response_model_exclude_unset``. All fields are therefore optional so a\nlean list item stays valid. Values are served straight from the cache\n(same source as the detail endpoint)." }, "CVEsubscription": { "properties": { @@ -11876,138 +11962,6 @@ ], "title": "FingerprintRuleResponse" }, - "FingerprintRuleSummary": { - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Fingerprint rule identifier" - }, - "name": { - "type": "string", - "title": "Name", - "description": "Fingerprint rule name" - }, - "title": { - "type": "string", - "title": "Title", - "description": "Fingerprint rule title" - }, - "affected_components": { - "items": { - "$ref": "#/components/schemas/AffectedComponent" - }, - "type": "array", - "title": "Affected Components", - "description": "List of affected components" - }, - "crowdsec_score": { - "type": "integer", - "maximum": 10.0, - "minimum": 0.0, - "title": "Crowdsec Score", - "description": "Live Exploit Tracker score for the fingerprint rule" - }, - "opportunity_score": { - "type": "integer", - "maximum": 5.0, - "minimum": 0.0, - "title": "Opportunity Score", - "description": "Opportunity score", - "default": 0 - }, - "momentum_score": { - "type": "integer", - "maximum": 5.0, - "minimum": 0.0, - "title": "Momentum Score", - "description": "Momentum score", - "default": 0 - }, - "first_seen": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "First Seen", - "description": "First seen date" - }, - "last_seen": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Last Seen", - "description": "Last seen date" - }, - "nb_ips": { - "type": "integer", - "minimum": 0.0, - "title": "Nb Ips", - "description": "Number of unique IPs observed" - }, - "rule_release_date": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Rule Release Date", - "description": "Release date of the fingerprint rule" - }, - "exploitation_phase": { - "$ref": "#/components/schemas/ExploitationPhase", - "description": "Current exploitation phase" - }, - "adjustment_score": { - "anyOf": [ - { - "$ref": "#/components/schemas/AdjustmentScore" - }, - { - "type": "null" - } - ], - "description": "Score adjustment details" - }, - "threat_context": { - "anyOf": [ - { - "$ref": "#/components/schemas/ThreatContext" - }, - { - "type": "null" - } - ], - "description": "Threat context (attacker/defender countries, industries, objectives)" - } - }, - "type": "object", - "required": [ - "id", - "name", - "title", - "affected_components", - "crowdsec_score", - "nb_ips", - "exploitation_phase" - ], - "title": "FingerprintRuleSummary" - }, "FingerprintTimelineItem": { "properties": { "timestamp": { @@ -12350,7 +12304,7 @@ "properties": { "items": { "items": { - "$ref": "#/components/schemas/CVEResponseBase" + "$ref": "#/components/schemas/CVEResponseDetailed" }, "type": "array", "title": "Items" @@ -12459,7 +12413,7 @@ "properties": { "items": { "items": { - "$ref": "#/components/schemas/FingerprintRuleSummary" + "$ref": "#/components/schemas/FingerprintRuleResponse" }, "type": "array", "title": "Items" diff --git a/pyproject.toml b/pyproject.toml index 3475644..75edbc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "crowdsec_service_api" -version = "1.128.0" +version = "v0.16.0" license = { text = "MIT" } authors = [ { name="crowdsec", email="info@crowdsec.net" } diff --git a/uv.lock b/uv.lock index 2dd3cda..0b5236b 100644 --- a/uv.lock +++ b/uv.lock @@ -13,43 +13,43 @@ wheels = [ [[package]] name = "anyio" -version = "4.13.0" +version = "4.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" }, ] [[package]] name = "botocore" -version = "1.43.27" +version = "1.43.34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/4e/db50ef135f1d9ffc85e209a124004a5829d8f12f4a7a0afdf380cb19866d/botocore-1.43.27.tar.gz", hash = "sha256:2093c316c24214e50e18640b1869513b759bb8cc48b95b004a8306cb9f0d6703", size = 15504242, upload-time = "2026-06-10T19:38:25.389Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/0d/559cdceb9f6acea6b91404970b7973e28a4434fa8a70eb1416b0af478d86/botocore-1.43.34.tar.gz", hash = "sha256:ccc973cf30c6445b30afe5760f6dc949a80f1f862cb23d9c45747f2c814ece77", size = 15591382, upload-time = "2026-06-19T19:33:28.561Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/46/05b227b34e434b54867c2c942b0bfbbe2fe41789c18bb15ef787d03e9a56/botocore-1.43.27-py3-none-any.whl", hash = "sha256:4976544e652d5a1d8eca135da019f8e1c2d749efa2f9a31a8fb8c76f1895a40b", size = 15190293, upload-time = "2026-06-10T19:38:22.298Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/dc5aab38e2b3f63380810465fab92c836e9e8bce458eba4a8a896f25e1d2/botocore-1.43.34-py3-none-any.whl", hash = "sha256:238a0269f33c5914b9343900b44767e783b3e8b6dcb6e065eac8b4495601c5df", size = 15277590, upload-time = "2026-06-19T19:33:24.562Z" }, ] [[package]] name = "certifi" -version = "2026.5.20" +version = "2026.6.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, ] [[package]] name = "crowdsec-service-api" -version = "1.128.0" +version = "0.16.0" source = { editable = "." } dependencies = [ { name = "botocore" },