Skip to content

Commit 671ba75

Browse files
authored
Revert "Support encryption for triggers parameters (#36492)" (#38253)
This reverts commit 8fb55f2.
1 parent 94f6fcc commit 671ba75

File tree

4 files changed

+8
-108
lines changed

4 files changed

+8
-108
lines changed

airflow/jobs/triggerer_job_runner.py

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@
2828
from contextlib import suppress
2929
from copy import copy
3030
from queue import SimpleQueue
31-
from typing import TYPE_CHECKING, TypeVar
31+
from typing import TYPE_CHECKING
3232

3333
from sqlalchemy import func, select
3434

3535
from airflow.configuration import conf
3636
from airflow.jobs.base_job_runner import BaseJobRunner
3737
from airflow.jobs.job import perform_heartbeat
38-
from airflow.models.trigger import ENCRYPTED_KWARGS_PREFIX, Trigger
38+
from airflow.models.trigger import Trigger
3939
from airflow.stats import Stats
40-
from airflow.triggers.base import BaseTrigger, TriggerEvent
40+
from airflow.triggers.base import TriggerEvent
4141
from airflow.typing_compat import TypedDict
4242
from airflow.utils import timezone
4343
from airflow.utils.log.file_task_handler import FileTaskHandler
@@ -60,6 +60,7 @@
6060

6161
from airflow.jobs.job import Job
6262
from airflow.models import TaskInstance
63+
from airflow.triggers.base import BaseTrigger
6364

6465
HANDLER_SUPPORTS_TRIGGERER = False
6566
"""
@@ -235,9 +236,6 @@ def setup_queue_listener():
235236
return None
236237

237238

238-
U = TypeVar("U", bound=BaseTrigger)
239-
240-
241239
class TriggererJobRunner(BaseJobRunner, LoggingMixin):
242240
"""
243241
Run active triggers in asyncio and update their dependent tests/DAGs once their events have fired.
@@ -675,7 +673,7 @@ def update_triggers(self, requested_trigger_ids: set[int]):
675673
continue
676674

677675
try:
678-
new_trigger_instance = self.trigger_row_to_trigger_instance(new_trigger_orm, trigger_class)
676+
new_trigger_instance = trigger_class(**new_trigger_orm.kwargs)
679677
except TypeError as err:
680678
self.log.error("Trigger failed; message=%s", err)
681679
self.failed_triggers.append((new_id, err))
@@ -710,18 +708,3 @@ def get_trigger_by_classpath(self, classpath: str) -> type[BaseTrigger]:
710708
if classpath not in self.trigger_cache:
711709
self.trigger_cache[classpath] = import_string(classpath)
712710
return self.trigger_cache[classpath]
713-
714-
def trigger_row_to_trigger_instance(self, trigger_row: Trigger, trigger_class: type[U]) -> U:
715-
"""Convert a Trigger row into a Trigger instance."""
716-
from airflow.models.crypto import get_fernet
717-
718-
decrypted_kwargs = {}
719-
fernet = get_fernet()
720-
for k, v in trigger_row.kwargs.items():
721-
if k.startswith(ENCRYPTED_KWARGS_PREFIX):
722-
decrypted_kwargs[k[len(ENCRYPTED_KWARGS_PREFIX) :]] = fernet.decrypt(
723-
v.encode("utf-8")
724-
).decode("utf-8")
725-
else:
726-
decrypted_kwargs[k] = v
727-
return trigger_class(**decrypted_kwargs)

airflow/models/trigger.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@
3838

3939
from airflow.triggers.base import BaseTrigger
4040

41-
ENCRYPTED_KWARGS_PREFIX = "encrypted__"
42-
4341

4442
class Trigger(Base):
4543
"""
@@ -92,17 +90,8 @@ def __init__(
9290
@internal_api_call
9391
def from_object(cls, trigger: BaseTrigger) -> Trigger:
9492
"""Alternative constructor that creates a trigger row based directly off of a Trigger object."""
95-
from airflow.models.crypto import get_fernet
96-
9793
classpath, kwargs = trigger.serialize()
98-
secure_kwargs = {}
99-
fernet = get_fernet()
100-
for k, v in kwargs.items():
101-
if k.startswith(ENCRYPTED_KWARGS_PREFIX):
102-
secure_kwargs[k] = fernet.encrypt(v.encode("utf-8")).decode("utf-8")
103-
else:
104-
secure_kwargs[k] = v
105-
return cls(classpath=classpath, kwargs=secure_kwargs)
94+
return cls(classpath=classpath, kwargs=kwargs)
10695

10796
@classmethod
10897
@internal_api_call

docs/apache-airflow/authoring-and-scheduling/deferring.rst

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -197,33 +197,6 @@ Triggers can be as complex or as simple as you want, provided they meet the desi
197197

198198
If you are new to writing asynchronous Python, be very careful when writing your ``run()`` method. Python's async model means that code can block the entire process if it does not correctly ``await`` when it does a blocking operation. Airflow attempts to detect process blocking code and warn you in the triggerer logs when it happens. You can enable extra checks by Python by setting the variable ``PYTHONASYNCIODEBUG=1`` when you are writing your trigger to make sure you're writing non-blocking code. Be especially careful when doing filesystem calls, because if the underlying filesystem is network-backed, it can be blocking.
199199

200-
Sensitive information in triggers
201-
'''''''''''''''''''''''''''''''''
202-
203-
Triggers are serialized and stored in the database, so they can be re-instantiated on any triggerer process. This means that any sensitive information you pass to a trigger will be stored in the database.
204-
If you want to pass sensitive information to a trigger, you can encrypt it before passing it to the trigger, and decrypt it inside the trigger, or update the argument name in the ``serialize`` method by adding ``encrypted__`` as a prefix, and Airflow will automatically encrypt the argument before storing it in the database, and decrypt it when it is read from the database.
205-
206-
.. code-block:: python
207-
208-
class MyTrigger(BaseTrigger):
209-
def __init__(self, param, secret):
210-
super().__init__()
211-
self.param = param
212-
self.secret = secret
213-
214-
def serialize(self):
215-
return (
216-
"airflow.triggers.MyTrigger",
217-
{
218-
"param": self.param,
219-
"encrypted__secret": self.secret,
220-
},
221-
)
222-
223-
async def run(self):
224-
# self.my_secret will be decrypted here
225-
...
226-
227200
High Availability
228201
-----------------
229202

tests/models/test_trigger.py

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,18 @@
1717
from __future__ import annotations
1818

1919
import datetime
20-
from typing import Any, AsyncIterator
2120

2221
import pytest
2322
import pytz
24-
from cryptography.fernet import Fernet
2523

2624
from airflow.jobs.job import Job
27-
from airflow.jobs.triggerer_job_runner import TriggererJobRunner, TriggerRunner
25+
from airflow.jobs.triggerer_job_runner import TriggererJobRunner
2826
from airflow.models import TaskInstance, Trigger
2927
from airflow.operators.empty import EmptyOperator
30-
from airflow.triggers.base import BaseTrigger, TriggerEvent
28+
from airflow.triggers.base import TriggerEvent
3129
from airflow.utils import timezone
3230
from airflow.utils.session import create_session
3331
from airflow.utils.state import State
34-
from tests.test_utils.config import conf_vars
3532

3633
pytestmark = pytest.mark.db_test
3734

@@ -340,45 +337,3 @@ def test_get_sorted_triggers_different_priority_weights(session, create_task_ins
340337
trigger_ids_query = Trigger.get_sorted_triggers(capacity=100, alive_triggerer_ids=[], session=session)
341338

342339
assert trigger_ids_query == [(2,), (1,)]
343-
344-
345-
class SensitiveKwargsTrigger(BaseTrigger):
346-
"""
347-
A trigger that has sensitive kwargs.
348-
"""
349-
350-
def __init__(self, param1: str, param2: str):
351-
super().__init__()
352-
self.param1 = param1
353-
self.param2 = param2
354-
355-
def serialize(self) -> tuple[str, dict[str, Any]]:
356-
return (
357-
"tests.models.test_trigger.SensitiveKwargsTrigger",
358-
{
359-
"param1": self.param1,
360-
"encrypted__param2": self.param2,
361-
},
362-
)
363-
364-
async def run(self) -> AsyncIterator[TriggerEvent]:
365-
yield TriggerEvent({})
366-
367-
368-
@conf_vars({("core", "fernet_key"): Fernet.generate_key().decode()})
369-
def test_serialize_sensitive_kwargs():
370-
"""
371-
Tests that sensitive kwargs are encrypted.
372-
"""
373-
trigger_instance = SensitiveKwargsTrigger(param1="value1", param2="value2")
374-
trigger_row: Trigger = Trigger.from_object(trigger_instance)
375-
376-
assert trigger_row.kwargs["param1"] == "value1"
377-
assert "param2" not in trigger_row.kwargs
378-
assert trigger_row.kwargs["encrypted__param2"] != "value2"
379-
380-
loaded_trigger: SensitiveKwargsTrigger = TriggerRunner().trigger_row_to_trigger_instance(
381-
trigger_row, SensitiveKwargsTrigger
382-
)
383-
assert loaded_trigger.param1 == "value1"
384-
assert loaded_trigger.param2 == "value2"

0 commit comments

Comments
 (0)