Skip to content

Commit

Permalink
Added support for API Keys APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
t0mz06 committed Jan 19, 2024
1 parent 9f3b9af commit c431318
Show file tree
Hide file tree
Showing 17 changed files with 361 additions and 47 deletions.
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,14 @@ Supported APIs
|:--------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Connectivity** | |
| `test_connectivity` | [Check availability of service](https://automation.trendmicro.com/xdr/api-v3#tag/Connectivity/paths/~1v3.0~1healthcheck~1connectivity/get) |
| **API Keys** | |
| `create_api_keys` | [Create API Keys](https://automation.trendmicro.com/xdr/api-v3#tag/API-Keys/paths/~1v3.0~1iam~1apiKeys/post) |
| `delete_api_keys` | [Delete API keys](https://automation.trendmicro.com/xdr/api-v3#tag/API-Keys/paths/~1v3.0~1iam~1apiKeys~1delete/post) |
| `update_api_key` | [Update API key](https://automation.trendmicro.com/xdr/api-v3#tag/API-Keys/paths/~1v3.0~1iam~1apiKeys~1%7Bid%7D/patch) |
| `get_api_key` | [Get API key](https://automation.trendmicro.com/xdr/api-v3#tag/API-Keys/paths/~1v3.0~1iam~1apiKeys~1%7Bid%7D/get) |
| `get_api_key_list` | [List API keys](https://automation.trendmicro.com/xdr/api-v3#tag/API-Keys/paths/~1v3.0~1iam~1apiKeys/get) |
| **Common** | |
| `get_base_task_result` | [Download response task results](https://automation.trendmicro.com/xdr/api-v3#tag/Common/paths/~1v3.0~1response~1tasks~1%7Bid%7D/get) |
| `get_task_result` | [Download response task results](https://automation.trendmicro.com/xdr/api-v3#tag/Common/paths/~1v3.0~1response~1tasks~1{id}/get) |
| `get_task_result/get_base_task_result` | [Download response task results](https://automation.trendmicro.com/xdr/api-v3#tag/Common/paths/~1v3.0~1response~1tasks~1%7Bid%7D/get) |
| **Custom Scripts** | |
| `get_custom_script_list` | [List custom scripts](https://automation.trendmicro.com/xdr/api-v3#tag/Custom-Script/paths/~1v3.0~1response~1customScripts/get) |
| `add_custom_script` | [Add custom script](https://automation.trendmicro.com/xdr/api-v3#tag/Custom-Script/paths/~1v3.0~1response~1customScripts/post) |
Expand Down
50 changes: 33 additions & 17 deletions src/pytmv1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
Account,
Alert,
AlertNote,
ApiKey,
Digest,
EmailActivity,
EmailMessage,
Expand All @@ -21,6 +22,7 @@
MatchedIndicatorPattern,
MatchedRule,
MsData,
MsDataApiKey,
MsDataUrl,
MsError,
SaeAlert,
Expand All @@ -33,6 +35,8 @@
ValueList,
)
from .model.enums import (
ApiExpInMonths,
ApiStatus,
EntityType,
EventID,
EventSubID,
Expand All @@ -55,12 +59,13 @@
)
from .model.requests import (
AccountRequest,
ApiKeyRequest,
CollectFileRequest,
CustomScriptRequest,
EmailMessageIdRequest,
EmailMessageUIdRequest,
EndpointRequest,
ObjectRequest,
RunCustomScriptRequest,
SuspiciousObjectRequest,
TerminateProcessRequest,
)
Expand All @@ -79,17 +84,20 @@
EndpointTaskResp,
GetAlertNoteResp,
GetAlertResp,
GetApiKeyResp,
GetEmailActivitiesCountResp,
GetEndpointActivitiesCountResp,
ListAlertNoteResp,
ListAlertsResp,
ListApiKeyResp,
ListCustomScriptsResp,
ListEmailActivityDataResp,
ListEndpointActivitiesResp,
ListEmailActivityResp,
ListEndpointActivityResp,
ListEndpointDataResp,
ListExceptionsResp,
ListSandboxSuspiciousResp,
ListSuspiciousResp,
MultiApiKeyResp,
MultiResp,
MultiUrlResp,
NoContentResp,
Expand All @@ -114,14 +122,20 @@
"AddCustomScriptResp",
"Alert",
"AlertNote",
"ApiExpInMonths",
"ApiKey",
"ApiKeyRequest",
"ApiStatus",
"BaseTaskResp",
"BlockListTaskResp",
"BytesResp",
"Client",
"CollectFileRequest",
"CollectFileTaskResp",
"ConnectivityResp",
"ConsumeLinkableResp",
"RunCustomScriptRequest",
"CustomScriptRequest",
"CustomScriptTaskResp",
"Digest",
"EmailActivity",
"EmailMessage",
Expand All @@ -138,57 +152,58 @@
"EventID",
"EventSubID",
"ExceptionObject",
"CollectFileRequest",
"FileType",
"GetAlertResp",
"ListAlertsResp",
"GetAlertNoteResp",
"ListAlertNoteResp",
"ListCustomScriptsResp",
"ListEmailActivityDataResp",
"GetApiKeyResp",
"GetEmailActivitiesCountResp",
"ListEndpointActivitiesResp",
"GetEndpointActivitiesCountResp",
"ListEndpointDataResp",
"ListExceptionsResp",
"ListSuspiciousResp",
"HostInfo",
"Iam",
"FileType",
"ImpactScope",
"Indicator",
"IntegrityLevel",
"InvestigationStatus",
"ListAlertsResp",
"ListAlertNoteResp",
"ListApiKeyResp",
"ListCustomScriptsResp",
"ListEmailActivityResp",
"ListEndpointActivityResp",
"ListEndpointDataResp",
"ListExceptionsResp",
"ListSandboxSuspiciousResp",
"ListSuspiciousResp",
"MatchedEvent",
"MatchedFilter",
"MatchedIndicatorPattern",
"MatchedRule",
"MsData",
"MsDataApiKey",
"MsDataUrl",
"MsError",
"MultiApiKeyResp",
"MultiResult",
"MultiResp",
"MultiUrlResp",
"NoContentResp",
"ObjectRequest",
"ObjectType",
"OperatingSystem",
"TerminateProcessRequest",
"ProductCode",
"Provenance",
"Provider",
"QueryOp",
"Result",
"ResultCode",
"RiskLevel",
"CustomScriptTaskResp",
"SaeAlert",
"SaeIndicator",
"SandboxAction",
"SandboxAnalysisResultResp",
"SandboxObjectType",
"SandboxSubmissionStatusResp",
"SandboxSubmitUrlTaskResp",
"ListSandboxSuspiciousResp",
"SandboxSuspiciousObject",
"ScanAction",
"Severity",
Expand All @@ -197,6 +212,7 @@
"SuspiciousObject",
"SuspiciousObjectRequest",
"TaskAction",
"TerminateProcessRequest",
"TerminateProcessTaskResp",
"TextResp",
"TiAlert",
Expand Down
2 changes: 2 additions & 0 deletions src/pytmv1/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .account import Account
from .alert import Alert
from .api_key import ApiKey
from .custom_script import CustomScript
from .email import Email
from .endpoint import Endpoint
Expand All @@ -10,6 +11,7 @@
__all__ = [
"Account",
"Alert",
"ApiKey",
"CustomScript",
"Email",
"Endpoint",
Expand Down
157 changes: 157 additions & 0 deletions src/pytmv1/api/api_key.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
from __future__ import annotations

from typing import Callable, Optional

from .. import utils
from ..core import Core
from ..model.commons import ApiKey as Apk
from ..model.enums import Api, ApiStatus, HttpMethod, QueryOp
from ..model.requests import ApiKeyRequest
from ..model.responses import (
ConsumeLinkableResp,
GetApiKeyResp,
ListApiKeyResp,
MultiApiKeyResp,
MultiResp,
NoContentResp,
)
from ..results import MultiResult, Result


class ApiKey:
_core: Core

def __init__(self, core: Core):
self._core = core

def create(
self,
*keys: ApiKeyRequest,
) -> MultiResult[MultiApiKeyResp]:
"""Generates API keys designed to access Trend Vision One APIs.
:param keys: API Key(s) to create.
:type keys: Tuple[ApiKeyTask, ...]
:return: MultiResult[MultiApiKeyResp]
"""
return self._core.send_multi(
MultiApiKeyResp,
Api.CREATE_API_KEYS,
json=[
task.model_dump(by_alias=True, exclude_none=True)
for task in keys
],
)

def get(self, key_id: str) -> Result[GetApiKeyResp]:
"""Retrieves the specified API key.
:param key_id: Identifier of the API key.
:type key_id: str
:return: Result[GetApiKeyDetailsResp]
"""
return self._core.send(
GetApiKeyResp, Api.GET_API_KEY.value.format(key_id)
)

def update(
self,
key_id: str,
etag: str,
role: Optional[str] = None,
name: Optional[str] = None,
status: Optional[ApiStatus] = None,
description: Optional[str] = None,
) -> Result[NoContentResp]:
"""Updates the specified API key.
:param key_id: Identifier of the API key.
:type key_id: str
:param etag: ETag of the resource you want to update.
:type etag: str
:param role: User role assigned to the API key.
:type role: Optional[str]
:param name: Unique name of the API key.
:type name: Optional[str]
:param status: Status of an API key.
:type status: Optional[ApiStatus]
:param description: A brief note about the API key
:type description: str
:return: Result[NoContentResp]
"""
return self._core.send(
NoContentResp,
Api.UPDATE_API_KEY.value.format(key_id),
HttpMethod.PATCH,
headers={"If-Match": etag if not etag.startswith("\"") else etag[1:-1]},
json=utils.filter_none(
{
"role": role,
"name": name,
"status": status,
"description": description,
}
),
)

def delete(self, *key_ids: str) -> MultiResult[MultiResp]:
"""Deletes the specified API keys.
:param key_ids: Identifier of the API keys.
:type key_ids: List[str]
:return: MultiResult[MultiResp]
"""
return self._core.send_multi(
MultiResp,
Api.DELETE_API_KEYS,
json=[{"id": key_id} for key_id in key_ids],
)

def list(
self, top: int = 50, op: QueryOp = QueryOp.AND, **fields: str
) -> Result[ListApiKeyResp]:
"""Retrieves API keys in a paginated list.
:param top: Number of records displayed on a page.
:type top: int
:param op: Query operator to apply.
:type op: QueryOp
:param fields: Field/value used to filter result (ie: id="...")
:type fields: Dict[str, str]
check Vision One API documentation for full list of supported fields.
:return: Result[GetApiKeyListResp]
"""
return self._core.send(
ListApiKeyResp,
Api.GET_API_KEY_LIST,
params={"orderBy": "createdDateTime desc", "top": top},
headers=utils.tmv1_filter(op, fields),
)

def consume(
self,
consumer: Callable[[Apk], None],
top: int = 50,
op: QueryOp = QueryOp.AND,
**fields: str,
) -> Result[ConsumeLinkableResp]:
"""Retrieves and consume API keys.
:param consumer: Function which will consume every record in result.
:type consumer: Callable[[ApiKey], None]
:param top: Number of records displayed on a page.
:type top: int
:param op: Query operator to apply.
:type op: QueryOp
:param fields: Field/value used to filter result (ie: id="...")
:type fields: Dict[str, str]
check Vision One API documentation for full list of supported fields.
:return: Result[GetApiKeyListResp]
"""
return self._core.send_linkable(
ListApiKeyResp,
Api.GET_API_KEY_LIST,
consumer,
params={"orderBy": "createdDateTime desc", "top": top},
headers=utils.tmv1_filter(op, fields),
)
4 changes: 2 additions & 2 deletions src/pytmv1/api/custom_script.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ..core import Core
from ..model.commons import Script
from ..model.enums import Api, FileType, HttpMethod, QueryOp
from ..model.requests import RunCustomScriptRequest
from ..model.requests import CustomScriptRequest
from ..model.responses import (
AddCustomScriptResp,
ConsumeLinkableResp,
Expand Down Expand Up @@ -131,7 +131,7 @@ def list(
params=utils.filter_query(op, fields),
)

def run(self, *scripts: RunCustomScriptRequest) -> MultiResult[MultiResp]:
def run(self, *scripts: CustomScriptRequest) -> MultiResult[MultiResp]:
"""Runs multiple custom script.
:param scripts: Custom scripts to run.
Expand Down
Loading

0 comments on commit c431318

Please sign in to comment.