maltego-transforms 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- maltego_transforms-1.0.0/LICENSE +21 -0
- maltego_transforms-1.0.0/PKG-INFO +189 -0
- maltego_transforms-1.0.0/README.md +136 -0
- maltego_transforms-1.0.0/pyproject.toml +133 -0
- maltego_transforms-1.0.0/src/maltego/_cli.py +443 -0
- maltego_transforms-1.0.0/src/maltego/_helper.py +64 -0
- maltego_transforms-1.0.0/src/maltego/auth/__init__.py +51 -0
- maltego_transforms-1.0.0/src/maltego/auth/claims.py +36 -0
- maltego_transforms-1.0.0/src/maltego/auth/dependency.py +480 -0
- maltego_transforms-1.0.0/src/maltego/auth/identity.py +110 -0
- maltego_transforms-1.0.0/src/maltego/auth/jwt_validator.py +236 -0
- maltego_transforms-1.0.0/src/maltego/auth/oidc_validator.py +118 -0
- maltego_transforms-1.0.0/src/maltego/auth/problem.py +198 -0
- maltego_transforms-1.0.0/src/maltego/auth/saml_validator.py +557 -0
- maltego_transforms-1.0.0/src/maltego/auth/settings.py +733 -0
- maltego_transforms-1.0.0/src/maltego/auth/validator.py +125 -0
- maltego_transforms-1.0.0/src/maltego/config.py +102 -0
- maltego_transforms-1.0.0/src/maltego/middlewares/middlewares.py +79 -0
- maltego_transforms-1.0.0/src/maltego/middlewares/oauth_middleware.py +213 -0
- maltego_transforms-1.0.0/src/maltego/middlewares/shared_settings_middleware.py +81 -0
- maltego_transforms-1.0.0/src/maltego/middlewares/user_concurrency_limit_middleware.py +113 -0
- maltego_transforms-1.0.0/src/maltego/middlewares/verify_metadata_middleware.py +72 -0
- maltego_transforms-1.0.0/src/maltego/model/__init__.py +113 -0
- maltego_transforms-1.0.0/src/maltego/model/context.py +678 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/__init__.py +1675 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/config.py +231 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/constants.py +86 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/display_info.py +26 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/property.py +369 -0
- maltego_transforms-1.0.0/src/maltego/model/entity/type_handling.py +36 -0
- maltego_transforms-1.0.0/src/maltego/model/event.py +329 -0
- maltego_transforms-1.0.0/src/maltego/model/exception.py +182 -0
- maltego_transforms-1.0.0/src/maltego/model/graph.py +656 -0
- maltego_transforms-1.0.0/src/maltego/model/icon.py +9 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/__init__.py +35 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/base.py +288 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/__init__.py +13 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/composite.py +60 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/property.py +81 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/type.py +42 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/__init__.py +25 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/composite.py +64 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/equals.py +336 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/match.py +330 -0
- maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/regex.py +221 -0
- maltego_transforms-1.0.0/src/maltego/model/link.py +369 -0
- maltego_transforms-1.0.0/src/maltego/model/machine.py +59 -0
- maltego_transforms-1.0.0/src/maltego/model/oauth.py +155 -0
- maltego_transforms-1.0.0/src/maltego/model/observer.py +53 -0
- maltego_transforms-1.0.0/src/maltego/model/prompt.py +305 -0
- maltego_transforms-1.0.0/src/maltego/model/server.py +952 -0
- maltego_transforms-1.0.0/src/maltego/model/transform/__init__.py +955 -0
- maltego_transforms-1.0.0/src/maltego/model/transform/setting.py +420 -0
- maltego_transforms-1.0.0/src/maltego/model/transform_input_annotation.py +322 -0
- maltego_transforms-1.0.0/src/maltego/model/transform_set.py +8 -0
- maltego_transforms-1.0.0/src/maltego/model/types.py +342 -0
- maltego_transforms-1.0.0/src/maltego/pagination/__init__.py +10 -0
- maltego_transforms-1.0.0/src/maltego/pagination/cursor_based_paginator.py +55 -0
- maltego_transforms-1.0.0/src/maltego/pagination/offset_limit_paginator.py +119 -0
- maltego_transforms-1.0.0/src/maltego/pagination/page_based_paginator.py +95 -0
- maltego_transforms-1.0.0/src/maltego/pagination/pagination.py +677 -0
- maltego_transforms-1.0.0/src/maltego/protocol/__init__.py +0 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/__init__.py +0 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/__init__.py +16 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/auth.py +23 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/capability.py +16 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/entity.py +71 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/hub_item.py +21 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/icon.py +19 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/machine.py +26 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/seed.py +19 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/status.py +15 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/transform.py +71 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/transform_set.py +12 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/error.py +13 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/__init__.py +0 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/entity.py +46 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/graph.py +13 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/link.py +17 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/metadata.py +12 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/property.py +21 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/transform_run.py +208 -0
- maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/ui_message.py +25 -0
- maltego_transforms-1.0.0/src/maltego/py.typed +0 -0
- maltego_transforms-1.0.0/src/maltego/runner/__init__.py +477 -0
- maltego_transforms-1.0.0/src/maltego/runner/transform_execution_context.py +620 -0
- maltego_transforms-1.0.0/src/maltego/runner/transform_result_set.py +261 -0
- maltego_transforms-1.0.0/src/maltego/server/__init__.py +1578 -0
- maltego_transforms-1.0.0/src/maltego/server/capability_matrix.py +432 -0
- maltego_transforms-1.0.0/src/maltego/server/etag_middleware.py +22 -0
- maltego_transforms-1.0.0/src/maltego/server/tracing_middleware.py +71 -0
- maltego_transforms-1.0.0/src/maltego/server/util.py +96 -0
- maltego_transforms-1.0.0/src/maltego/server/v3/__init__.py +1611 -0
- maltego_transforms-1.0.0/src/maltego/server/version.py +2 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/README.md +1 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-basics/SKILL.md +27 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-basics/references/transform-authoring-patterns.md +257 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-build/SKILL.md +173 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-design/SKILL.md +80 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-design/references/standard-entity-selection.md +148 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/SKILL.md +91 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/references/direct-server-discovery.md +189 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/scripts/discover_server.py +97 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-docs/SKILL.md +54 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-docs/references/docs-routing.md +58 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-skill-index/SKILL.md +60 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/SKILL.md +214 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/references/testing-and-parity.md +300 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/scripts/README.md +29 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/scripts/sdk_project_check.py +283 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transforms/SKILL.md +53 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/SKILL.md +244 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/references/trx-to-sdk-mapping.md +177 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/scripts/README.md +42 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/scripts/trx_to_sdk_candidates.py +223 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/SKILL.md +230 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/known-trx-examples.md +96 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/standard-entity-selection.md +148 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/trx-risk-taxonomy.md +142 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/trx-to-sdk-mapping.md +177 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/README.md +76 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/std_entity_lookup.py +142 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_contract.py +312 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_inventory.py +297 -0
- maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_migration_report.py +222 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/README.md +105 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/__init__.py +0 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/project.py +34 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/requirements.txt +2 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/__init__.py +0 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/entity_features_example.py +217 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/error_handling_example.py +206 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/input_constraints_example.py +262 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/logging_example.py +120 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/middleware_example.py +197 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/pagination_example.py +325 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/prompts_example.py +373 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/quickstart_example.py +349 -0
- maltego_transforms-1.0.0/src/maltego/template_dir/transforms/transform_settings_example.py +481 -0
- maltego_transforms-1.0.0/src/maltego/template_minimal_dir/README.md +84 -0
- maltego_transforms-1.0.0/src/maltego/template_minimal_dir/__init__.py +1 -0
- maltego_transforms-1.0.0/src/maltego/template_minimal_dir/project.py +21 -0
- maltego_transforms-1.0.0/src/maltego/template_minimal_dir/requirements.txt +2 -0
- maltego_transforms-1.0.0/src/maltego/template_minimal_dir/transforms/__init__.py +1 -0
- maltego_transforms-1.0.0/src/maltego/tracing/__init__.py +133 -0
- maltego_transforms-1.0.0/src/maltego/util/__init__.py +568 -0
- maltego_transforms-1.0.0/src/maltego/util/collections_utils.py +8 -0
- maltego_transforms-1.0.0/src/maltego/util/trace_context.py +3 -0
- maltego_transforms-1.0.0/src/maltego/util/typing.py +23 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Maltego Technologies GmbH
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: maltego-transforms
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Maltego Transform development framework with async support and standalone Transform server
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: maltego,osint,transforms,sdk,graph
|
|
7
|
+
Author: Maltego Technologies GmbH
|
|
8
|
+
Requires-Python: >=3.10,<3.15
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
|
+
Provides-Extra: tracing
|
|
20
|
+
Requires-Dist: Pillow (>=12.3.0,<13.0.0)
|
|
21
|
+
Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
|
|
22
|
+
Requires-Dist: authlib (>=1.6.11,<1.7.0)
|
|
23
|
+
Requires-Dist: cachetools (>=6.1.0,<7.0.0)
|
|
24
|
+
Requires-Dist: cryptography (>=48.0.1,<49.0.0)
|
|
25
|
+
Requires-Dist: fastapi (>=0.137.1,<0.138.0)
|
|
26
|
+
Requires-Dist: fastapi-restful (>=0.5,<0.6)
|
|
27
|
+
Requires-Dist: frozenlist (>=1.4.1,<2.0.0)
|
|
28
|
+
Requires-Dist: httpx (>=0.27.2,<0.28.0)
|
|
29
|
+
Requires-Dist: idna (>=3.15,<4.0)
|
|
30
|
+
Requires-Dist: joserfc (>=1.6.8,<2.0.0)
|
|
31
|
+
Requires-Dist: markdown (>=3.4.0,<4.0.0)
|
|
32
|
+
Requires-Dist: nh3 (>=0.3.6,<0.4.0)
|
|
33
|
+
Requires-Dist: opentelemetry-api (>=1.26,<2.0) ; extra == "tracing"
|
|
34
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.26,<2.0) ; extra == "tracing"
|
|
35
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.47b0,<1.0) ; extra == "tracing"
|
|
36
|
+
Requires-Dist: opentelemetry-propagator-b3 (>=1.26,<2.0) ; extra == "tracing"
|
|
37
|
+
Requires-Dist: opentelemetry-sdk (>=1.26,<2.0) ; extra == "tracing"
|
|
38
|
+
Requires-Dist: packaging (>=25.0,<26.0)
|
|
39
|
+
Requires-Dist: pycryptodome (>=3.20,<4.0)
|
|
40
|
+
Requires-Dist: pydantic (>=2.13,<3.0)
|
|
41
|
+
Requires-Dist: pydantic-settings (>=2.1,<3.0)
|
|
42
|
+
Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
|
|
43
|
+
Requires-Dist: signxml (>=4.4.0,<5.0.0)
|
|
44
|
+
Requires-Dist: starlette (>=1.3.1,<2.0.0)
|
|
45
|
+
Requires-Dist: typing-extensions (>=4.9,<5.0)
|
|
46
|
+
Requires-Dist: typing-inspect (>=0.9,<0.10)
|
|
47
|
+
Requires-Dist: uvicorn (>=0.35.0,<0.36.0)
|
|
48
|
+
Project-URL: Documentation, https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview
|
|
49
|
+
Project-URL: Homepage, https://github.com/MaltegoTech/maltego-transforms
|
|
50
|
+
Project-URL: Repository, https://github.com/MaltegoTech/maltego-transforms
|
|
51
|
+
Description-Content-Type: text/markdown
|
|
52
|
+
|
|
53
|
+
# maltego-transforms
|
|
54
|
+
|
|
55
|
+
**The Python SDK for building Maltego transform servers.**
|
|
56
|
+
|
|
57
|
+
<!-- Badges activate once the repo goes public and the ci.yml workflow lands; they won't render against a private repo. -->
|
|
58
|
+

|
|
59
|
+

|
|
60
|
+

|
|
61
|
+

|
|
62
|
+
<!--  — add once Codecov is configured -->
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
A **transform** takes one or more Maltego entities as input — an IP address, a domain, a person, a document, or your own custom object — and returns related entities as output. Transforms are how Maltego expands a graph, and `maltego-transforms` is the fastest way to write and run your own.
|
|
67
|
+
|
|
68
|
+
## Install
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install maltego-transforms
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Requires Python `>=3.10,<3.15`.
|
|
75
|
+
|
|
76
|
+
## Your first transform
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from maltego.server import (
|
|
80
|
+
MaltegoContext,
|
|
81
|
+
MaltegoEntity,
|
|
82
|
+
MaltegoServerSettings,
|
|
83
|
+
register_transform,
|
|
84
|
+
run_server,
|
|
85
|
+
setup,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@register_transform(
|
|
90
|
+
display_name="Hello World [My Transforms]",
|
|
91
|
+
transform_set="My Transforms",
|
|
92
|
+
)
|
|
93
|
+
async def hello_world(
|
|
94
|
+
input_entity: MaltegoEntity,
|
|
95
|
+
context: MaltegoContext,
|
|
96
|
+
) -> MaltegoEntity:
|
|
97
|
+
context.log.inform(f"Hello from {context.remote_ip}")
|
|
98
|
+
return MaltegoEntity["maltego.Phrase"](f"Hello, {input_entity.value}") # type: ignore
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
if __name__ == "__main__":
|
|
102
|
+
settings = MaltegoServerSettings(
|
|
103
|
+
server_name="My Transform Server",
|
|
104
|
+
ns="my.transforms",
|
|
105
|
+
author="i@example.com",
|
|
106
|
+
)
|
|
107
|
+
setup(settings)
|
|
108
|
+
run_server(settings=settings, ssl=False) # plain HTTP for local development
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Save this as `project.py` and run it:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
python project.py
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
This starts a local HTTP server on `127.0.0.1:3000`, serving a seed URL at `/seed`. Add that URL to Maltego to discover and install your transforms. SSL is on by default for anything beyond local dev — see [HTTPS, Certificates, and Browser Trust](https://docs.maltego.com/en/support/solutions/articles/15000062366-https-certificates-and-browser-trust), which the Graph Browser client requires.
|
|
118
|
+
|
|
119
|
+
Prefer a ready-made project over a blank file?
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
maltego-transforms start my_project
|
|
123
|
+
cd my_project
|
|
124
|
+
python -m venv .venv && source .venv/bin/activate
|
|
125
|
+
pip install -r requirements.txt
|
|
126
|
+
python project.py
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
This scaffolds a runnable project with example transforms covering the most common patterns.
|
|
130
|
+
|
|
131
|
+
## Runbooks
|
|
132
|
+
|
|
133
|
+
Repository runbooks live in [`runbooks/`](runbooks/) and capture repeatable
|
|
134
|
+
workflows for contributors and coding agents, including writing PRPs for
|
|
135
|
+
non-trivial changes and choosing the right test command.
|
|
136
|
+
|
|
137
|
+
## Features
|
|
138
|
+
|
|
139
|
+
- **Decorator-based registration** — `@register_transform` turns any function into a discoverable transform
|
|
140
|
+
- **Typed input and output** — plain Python type hints; the SDK infers and validates entity types for you
|
|
141
|
+
- **Async and streaming** — write `async def` transforms, or use `AsyncGenerator` to stream results as they're found
|
|
142
|
+
- **OAuth** — built-in support for OAuth-authenticated transforms
|
|
143
|
+
- **Transform settings** — expose configurable options (API keys, limits, toggles) that users fill in from the Maltego client
|
|
144
|
+
- **Input constraints** — control which entities a transform is even offered for, before it runs
|
|
145
|
+
- **Middlewares** — hook into the request/response lifecycle for logging, auth, or shared setup
|
|
146
|
+
|
|
147
|
+
## Standard entities
|
|
148
|
+
|
|
149
|
+
Want typed entity classes instead of raw dictionaries? [`maltego-transforms-std-entities`](https://docs.maltego.com/en/support/solutions/articles/15000062357-standard-entities-overview) ships ready-made classes like `Person`, `DNSName`, and `IPv4Address`:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
pip install maltego-transforms-std-entities
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
from maltego.entities import DNSName, IPv4Address
|
|
157
|
+
from maltego.server import register_transform
|
|
158
|
+
|
|
159
|
+
@register_transform
|
|
160
|
+
async def dns_to_ip(input_entity: DNSName) -> IPv4Address:
|
|
161
|
+
return IPv4Address("1.1.1.1")
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Building with an AI coding agent
|
|
165
|
+
|
|
166
|
+
Scaffold a project with agent skills for authoring and testing transforms:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
maltego-transforms start my-project --with-skills
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
This drops a skill index into `.agents/skills/` that points your coding agent at the right focused skill for the task at hand — building a new transform, migrating an existing one, or debugging discovery. See [Using AI Agent Skills with the SDK](https://docs.maltego.com/en/support/solutions/articles/15000062361-using-ai-agent-skills-with-the-sdk) for details.
|
|
173
|
+
|
|
174
|
+
## Documentation
|
|
175
|
+
|
|
176
|
+
Full docs — configuration, authentication, entity modeling, pagination, and the complete API reference — start at the **[Maltego Transforms SDK overview](https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview)**.
|
|
177
|
+
|
|
178
|
+
## Support
|
|
179
|
+
|
|
180
|
+
Questions or issues? Reach out through the [Maltego Support Portal](https://support.maltego.com/) or your Maltego account contact.
|
|
181
|
+
|
|
182
|
+
## Contributing
|
|
183
|
+
|
|
184
|
+
Contributions are welcome — see [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines.
|
|
185
|
+
|
|
186
|
+
## License
|
|
187
|
+
|
|
188
|
+
`maltego-transforms` is licensed under the [MIT License](LICENSE).
|
|
189
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# maltego-transforms
|
|
2
|
+
|
|
3
|
+
**The Python SDK for building Maltego transform servers.**
|
|
4
|
+
|
|
5
|
+
<!-- Badges activate once the repo goes public and the ci.yml workflow lands; they won't render against a private repo. -->
|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
<!--  — add once Codecov is configured -->
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
A **transform** takes one or more Maltego entities as input — an IP address, a domain, a person, a document, or your own custom object — and returns related entities as output. Transforms are how Maltego expands a graph, and `maltego-transforms` is the fastest way to write and run your own.
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install maltego-transforms
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Requires Python `>=3.10,<3.15`.
|
|
23
|
+
|
|
24
|
+
## Your first transform
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
from maltego.server import (
|
|
28
|
+
MaltegoContext,
|
|
29
|
+
MaltegoEntity,
|
|
30
|
+
MaltegoServerSettings,
|
|
31
|
+
register_transform,
|
|
32
|
+
run_server,
|
|
33
|
+
setup,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@register_transform(
|
|
38
|
+
display_name="Hello World [My Transforms]",
|
|
39
|
+
transform_set="My Transforms",
|
|
40
|
+
)
|
|
41
|
+
async def hello_world(
|
|
42
|
+
input_entity: MaltegoEntity,
|
|
43
|
+
context: MaltegoContext,
|
|
44
|
+
) -> MaltegoEntity:
|
|
45
|
+
context.log.inform(f"Hello from {context.remote_ip}")
|
|
46
|
+
return MaltegoEntity["maltego.Phrase"](f"Hello, {input_entity.value}") # type: ignore
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == "__main__":
|
|
50
|
+
settings = MaltegoServerSettings(
|
|
51
|
+
server_name="My Transform Server",
|
|
52
|
+
ns="my.transforms",
|
|
53
|
+
author="i@example.com",
|
|
54
|
+
)
|
|
55
|
+
setup(settings)
|
|
56
|
+
run_server(settings=settings, ssl=False) # plain HTTP for local development
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Save this as `project.py` and run it:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python project.py
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
This starts a local HTTP server on `127.0.0.1:3000`, serving a seed URL at `/seed`. Add that URL to Maltego to discover and install your transforms. SSL is on by default for anything beyond local dev — see [HTTPS, Certificates, and Browser Trust](https://docs.maltego.com/en/support/solutions/articles/15000062366-https-certificates-and-browser-trust), which the Graph Browser client requires.
|
|
66
|
+
|
|
67
|
+
Prefer a ready-made project over a blank file?
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
maltego-transforms start my_project
|
|
71
|
+
cd my_project
|
|
72
|
+
python -m venv .venv && source .venv/bin/activate
|
|
73
|
+
pip install -r requirements.txt
|
|
74
|
+
python project.py
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
This scaffolds a runnable project with example transforms covering the most common patterns.
|
|
78
|
+
|
|
79
|
+
## Runbooks
|
|
80
|
+
|
|
81
|
+
Repository runbooks live in [`runbooks/`](runbooks/) and capture repeatable
|
|
82
|
+
workflows for contributors and coding agents, including writing PRPs for
|
|
83
|
+
non-trivial changes and choosing the right test command.
|
|
84
|
+
|
|
85
|
+
## Features
|
|
86
|
+
|
|
87
|
+
- **Decorator-based registration** — `@register_transform` turns any function into a discoverable transform
|
|
88
|
+
- **Typed input and output** — plain Python type hints; the SDK infers and validates entity types for you
|
|
89
|
+
- **Async and streaming** — write `async def` transforms, or use `AsyncGenerator` to stream results as they're found
|
|
90
|
+
- **OAuth** — built-in support for OAuth-authenticated transforms
|
|
91
|
+
- **Transform settings** — expose configurable options (API keys, limits, toggles) that users fill in from the Maltego client
|
|
92
|
+
- **Input constraints** — control which entities a transform is even offered for, before it runs
|
|
93
|
+
- **Middlewares** — hook into the request/response lifecycle for logging, auth, or shared setup
|
|
94
|
+
|
|
95
|
+
## Standard entities
|
|
96
|
+
|
|
97
|
+
Want typed entity classes instead of raw dictionaries? [`maltego-transforms-std-entities`](https://docs.maltego.com/en/support/solutions/articles/15000062357-standard-entities-overview) ships ready-made classes like `Person`, `DNSName`, and `IPv4Address`:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
pip install maltego-transforms-std-entities
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
from maltego.entities import DNSName, IPv4Address
|
|
105
|
+
from maltego.server import register_transform
|
|
106
|
+
|
|
107
|
+
@register_transform
|
|
108
|
+
async def dns_to_ip(input_entity: DNSName) -> IPv4Address:
|
|
109
|
+
return IPv4Address("1.1.1.1")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Building with an AI coding agent
|
|
113
|
+
|
|
114
|
+
Scaffold a project with agent skills for authoring and testing transforms:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
maltego-transforms start my-project --with-skills
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
This drops a skill index into `.agents/skills/` that points your coding agent at the right focused skill for the task at hand — building a new transform, migrating an existing one, or debugging discovery. See [Using AI Agent Skills with the SDK](https://docs.maltego.com/en/support/solutions/articles/15000062361-using-ai-agent-skills-with-the-sdk) for details.
|
|
121
|
+
|
|
122
|
+
## Documentation
|
|
123
|
+
|
|
124
|
+
Full docs — configuration, authentication, entity modeling, pagination, and the complete API reference — start at the **[Maltego Transforms SDK overview](https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview)**.
|
|
125
|
+
|
|
126
|
+
## Support
|
|
127
|
+
|
|
128
|
+
Questions or issues? Reach out through the [Maltego Support Portal](https://support.maltego.com/) or your Maltego account contact.
|
|
129
|
+
|
|
130
|
+
## Contributing
|
|
131
|
+
|
|
132
|
+
Contributions are welcome — see [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines.
|
|
133
|
+
|
|
134
|
+
## License
|
|
135
|
+
|
|
136
|
+
`maltego-transforms` is licensed under the [MIT License](LICENSE).
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["poetry-core>=1.5.0"]
|
|
3
|
+
build-backend = "poetry.core.masonry.api"
|
|
4
|
+
|
|
5
|
+
[[tool.poetry.source]]
|
|
6
|
+
name = "PyPI"
|
|
7
|
+
priority = "primary"
|
|
8
|
+
|
|
9
|
+
[tool.poetry]
|
|
10
|
+
name = "maltego-transforms"
|
|
11
|
+
version = "1.0.0"
|
|
12
|
+
description = "Maltego Transform development framework with async support and standalone Transform server"
|
|
13
|
+
authors = [
|
|
14
|
+
"Maltego Technologies GmbH",
|
|
15
|
+
]
|
|
16
|
+
license = "MIT"
|
|
17
|
+
readme = "README.md"
|
|
18
|
+
homepage = "https://github.com/MaltegoTech/maltego-transforms"
|
|
19
|
+
repository = "https://github.com/MaltegoTech/maltego-transforms"
|
|
20
|
+
documentation = "https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview"
|
|
21
|
+
keywords = ["maltego", "osint", "transforms", "sdk", "graph"]
|
|
22
|
+
classifiers = [
|
|
23
|
+
"Development Status :: 5 - Production/Stable",
|
|
24
|
+
"Intended Audience :: Developers",
|
|
25
|
+
"License :: OSI Approved :: MIT License",
|
|
26
|
+
"Programming Language :: Python :: 3",
|
|
27
|
+
"Programming Language :: Python :: 3.10",
|
|
28
|
+
"Programming Language :: Python :: 3.11",
|
|
29
|
+
"Programming Language :: Python :: 3.12",
|
|
30
|
+
"Programming Language :: Python :: 3.13",
|
|
31
|
+
"Programming Language :: Python :: 3.14",
|
|
32
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
33
|
+
]
|
|
34
|
+
packages = [
|
|
35
|
+
{ include = "maltego", from = "src" },
|
|
36
|
+
]
|
|
37
|
+
# Belt-and-suspenders exclusion of credentials/key material from built artifacts.
|
|
38
|
+
# These globs are evaluated relative to the source tree that poetry packages up; they
|
|
39
|
+
# complement the existing built-artifact assertion tests in src/tests/packaging/.
|
|
40
|
+
exclude = [
|
|
41
|
+
"**/*.key",
|
|
42
|
+
"**/*.pem",
|
|
43
|
+
"**/*.crt",
|
|
44
|
+
"**/.env",
|
|
45
|
+
"**/.env.*",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
[tool.poetry.scripts]
|
|
49
|
+
maltego-transforms = 'maltego._cli:execute_from_command_line'
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
[tool.poetry.dependencies]
|
|
53
|
+
python = ">=3.10,<3.15"
|
|
54
|
+
uvicorn = "^0.35.0"
|
|
55
|
+
fastapi = "^0.137.1"
|
|
56
|
+
aiofiles = "^24.1.0"
|
|
57
|
+
cachetools = "^6.1.0"
|
|
58
|
+
typing-extensions = "^4.9"
|
|
59
|
+
httpx = "^0.27.2"
|
|
60
|
+
python-dateutil = "^2.8.2"
|
|
61
|
+
Pillow = "^12.3.0"
|
|
62
|
+
pycryptodome = "^3.20"
|
|
63
|
+
markdown = "^3.4.0"
|
|
64
|
+
frozenlist = "^1.4.1"
|
|
65
|
+
pydantic = "^2.13"
|
|
66
|
+
fastapi-restful = "^0.5"
|
|
67
|
+
typing-inspect = "^0.9"
|
|
68
|
+
pydantic-settings = "^2.1"
|
|
69
|
+
authlib = ">=1.6.11,<1.7.0"
|
|
70
|
+
packaging = "^25.0"
|
|
71
|
+
cryptography = "^48.0.1"
|
|
72
|
+
joserfc = "^1.6.8"
|
|
73
|
+
signxml = "^4.4.0"
|
|
74
|
+
idna = "^3.15"
|
|
75
|
+
starlette = ">=1.3.1,<2.0.0"
|
|
76
|
+
nh3 = "^0.3.6"
|
|
77
|
+
opentelemetry-api = {version = ">=1.26,<2.0", optional = true}
|
|
78
|
+
opentelemetry-sdk = {version = ">=1.26,<2.0", optional = true}
|
|
79
|
+
opentelemetry-instrumentation-fastapi = {version = ">=0.47b0,<1.0", optional = true}
|
|
80
|
+
opentelemetry-propagator-b3 = {version = ">=1.26,<2.0", optional = true}
|
|
81
|
+
opentelemetry-exporter-otlp-proto-grpc = {version = ">=1.26,<2.0", optional = true}
|
|
82
|
+
|
|
83
|
+
[tool.poetry.extras]
|
|
84
|
+
tracing = [
|
|
85
|
+
"opentelemetry-api",
|
|
86
|
+
"opentelemetry-sdk",
|
|
87
|
+
"opentelemetry-instrumentation-fastapi",
|
|
88
|
+
"opentelemetry-propagator-b3",
|
|
89
|
+
"opentelemetry-exporter-otlp-proto-grpc",
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
[tool.poetry.group.dev.dependencies]
|
|
93
|
+
pytest = "^8"
|
|
94
|
+
pytest-asyncio = "^0"
|
|
95
|
+
pytest-cov = "^4"
|
|
96
|
+
xmltodict = "^0"
|
|
97
|
+
autopep8 = "^2"
|
|
98
|
+
pylint= "^3"
|
|
99
|
+
mypy = "^1"
|
|
100
|
+
toml = "^0"
|
|
101
|
+
types-aiofiles = "^22"
|
|
102
|
+
types-cachetools = "^5"
|
|
103
|
+
types-certifi = "^2021"
|
|
104
|
+
types-chardet = "^5"
|
|
105
|
+
types-python-dateutil = "^2"
|
|
106
|
+
types-requests = "^2"
|
|
107
|
+
types-markdown = "^3"
|
|
108
|
+
types-xmltodict = "^0"
|
|
109
|
+
types-Pillow = "^9"
|
|
110
|
+
types-toml = "^0"
|
|
111
|
+
syrupy = "^4"
|
|
112
|
+
cyclonedx-bom = "^7.3.0"
|
|
113
|
+
detect-secrets = "^1.5.0"
|
|
114
|
+
pip-audit = "^2.10.1"
|
|
115
|
+
ruff = "^0.14.11"
|
|
116
|
+
pre-commit = "^4.6.0"
|
|
117
|
+
commitizen = "<4.16.4"
|
|
118
|
+
|
|
119
|
+
[tool.commitizen]
|
|
120
|
+
name = "cz_conventional_commits"
|
|
121
|
+
tag_format = "$version"
|
|
122
|
+
version_scheme = "pep440"
|
|
123
|
+
version_provider = "poetry"
|
|
124
|
+
update_changelog_on_bump = true
|
|
125
|
+
|
|
126
|
+
[tool.ruff]
|
|
127
|
+
line-length = 120
|
|
128
|
+
|
|
129
|
+
[tool.ruff.lint]
|
|
130
|
+
ignore = [
|
|
131
|
+
"F403",
|
|
132
|
+
"F405",
|
|
133
|
+
]
|