11import json
22from enum import Enum
3+ from typing import Any
34
45import requests
56from l9format import l9format
89from leakix .domain import L9Subdomain
910from leakix .plugin import APIResult
1011from leakix .query import EmptyQuery , Query
11- from leakix .response import ErrorResponse , RateLimitResponse , SuccessResponse
12+ from leakix .response import (
13+ AbstractResponse ,
14+ ErrorResponse ,
15+ RateLimitResponse ,
16+ SuccessResponse ,
17+ )
1218
1319__VERSION__ = "0.1.9"
1420
@@ -33,17 +39,17 @@ def __init__(
3339 self ,
3440 api_key : str | None = None ,
3541 base_url : str | None = DEFAULT_URL ,
36- ):
42+ ) -> None :
3743 self .api_key = api_key
3844 self .base_url = base_url if base_url else DEFAULT_URL
39- self .headers = {
45+ self .headers : dict [ str , str ] = {
4046 "Accept" : "application/json" ,
4147 "User-agent" : f"leakix-client-python/{ __VERSION__ } " ,
4248 }
4349 if api_key :
4450 self .headers ["api-key" ] = api_key
4551
46- def __get (self , url , params ) :
52+ def __get (self , url : str , params : dict [ str , Any ] | None ) -> AbstractResponse :
4753 r = requests .get (
4854 url ,
4955 params = params ,
@@ -59,7 +65,12 @@ def __get(self, url, params):
5965 else :
6066 return ErrorResponse (response = r , response_json = r .json ())
6167
62- def get (self , scope : Scope , queries : list [Query ] | None = None , page : int = 0 ):
68+ def get (
69+ self ,
70+ scope : Scope ,
71+ queries : list [Query ] | None = None ,
72+ page : int = 0 ,
73+ ) -> AbstractResponse :
6374 """
6475 The function takes a scope (either "leaks" or "services"). The value can be constructed using `Scope.SERVICE` or
6576 `Scope.LEAK`.
@@ -92,11 +103,18 @@ def get(self, scope: Scope, queries: list[Query] | None = None, page: int = 0):
92103 serialized_query = f"{ serialized_query } "
93104 url = f"{ self .base_url } /search"
94105 r = self .__get (
95- url = url , params = {"scope" : scope .value , "q" : serialized_query , "page" : page }
106+ url = url ,
107+ params = {
108+ "scope" : scope .value ,
109+ "q" : serialized_query ,
110+ "page" : page ,
111+ },
96112 )
97113 return r
98114
99- def get_service (self , queries : list [Query ] | None = None , page : int = 0 ):
115+ def get_service (
116+ self , queries : list [Query ] | None = None , page : int = 0
117+ ) -> AbstractResponse :
100118 """
101119 Shortcut for `get` with the scope `Scope.Service`.
102120
@@ -108,7 +126,9 @@ def get_service(self, queries: list[Query] | None = None, page: int = 0):
108126 ]
109127 return r
110128
111- def get_leak (self , queries : list [Query ] | None = None , page : int = 0 ):
129+ def get_leak (
130+ self , queries : list [Query ] | None = None , page : int = 0
131+ ) -> AbstractResponse :
112132 """
113133 Shortcut for `get` with the scope `Scope.Leak`.
114134 """
@@ -119,7 +139,7 @@ def get_leak(self, queries: list[Query] | None = None, page: int = 0):
119139 ]
120140 return r
121141
122- def get_host (self , ipv4 : str ):
142+ def get_host (self , ipv4 : str ) -> AbstractResponse :
123143 """
124144 Returns the list of services and associated leaks for a given host. Only the ipv4 format is supported at the
125145 moment.
@@ -136,7 +156,7 @@ def get_host(self, ipv4: str):
136156 r .response_json = response_json
137157 return r
138158
139- def get_plugins (self ):
159+ def get_plugins (self ) -> AbstractResponse :
140160 """
141161 Returns the list of plugins the authenticated user with the given API key has access to.
142162
@@ -152,7 +172,7 @@ def get_plugins(self):
152172 r .response_json = [APIResult .from_dict (d ) for d in r .json ()]
153173 return r
154174
155- def get_subdomains (self , domain : str ):
175+ def get_subdomains (self , domain : str ) -> AbstractResponse :
156176 """
157177 Returns the list of subdomains for a given domain.
158178 The output is a list of `L9Subdomain` objects. The fields are `subdomain`, `distinct_ips` and `last_seen`.
@@ -164,7 +184,7 @@ def get_subdomains(self, domain: str):
164184 r .response_json = [L9Subdomain .from_dict (d ) for d in r .json ()]
165185 return r
166186
167- def bulk_export (self , queries : list [Query ] | None = None ):
187+ def bulk_export (self , queries : list [Query ] | None = None ) -> AbstractResponse :
168188 url = f"{ self .base_url } /bulk/search"
169189 if queries is None or len (queries ) == 0 :
170190 serialized_query = EmptyQuery ().serialize ()
@@ -188,7 +208,9 @@ def bulk_export(self, queries: list[Query] | None = None):
188208 return ErrorResponse (response = r , response_json = r .json ())
189209 return r
190210
191- def bulk_export_last_event (self , queries : list [Query ] | None = None ):
211+ def bulk_export_last_event (
212+ self , queries : list [Query ] | None = None
213+ ) -> AbstractResponse :
192214 response = self .bulk_export (queries )
193215 if response .is_success ():
194216 for aggreg in response .json ():
@@ -201,7 +223,7 @@ def bulk_export_last_event(self, queries: list[Query] | None = None):
201223 aggreg .events = [sorted_events [0 ]]
202224 return response
203225
204- def bulk_service (self , queries : list [Query ] | None = None ):
226+ def bulk_service (self , queries : list [Query ] | None = None ) -> AbstractResponse :
205227 url = f"{ self .base_url } /bulk/service"
206228 if queries is None or len (queries ) == 0 :
207229 serialized_query = EmptyQuery ().serialize ()
0 commit comments