@@ -154,6 +154,16 @@ def truncate_task_duration(task_duration):
154
154
return int (task_duration ) if task_duration > 10.0 else round (task_duration , 3 )
155
155
156
156
157
+ def sanitize_args (args : dict [str , str ]) -> dict [str , str ]:
158
+ """
159
+ Remove all parameters starting with `_`
160
+
161
+ :param args: arguments of request
162
+ :return: copy of the dictionary passed as input with args starting with `_` removed.
163
+ """
164
+ return {key : value for key , value in args .items () if not key .startswith ("_" )}
165
+
166
+
157
167
def get_safe_url (url ):
158
168
"""Given a user-supplied URL, ensure it points to our web server"""
159
169
if not url :
@@ -1169,7 +1179,7 @@ def last_dagruns(self, session=None):
1169
1179
)
1170
1180
def legacy_code (self ):
1171
1181
"""Redirect from url param."""
1172
- return redirect (url_for ("Airflow.code" , ** request .args ))
1182
+ return redirect (url_for ("Airflow.code" , ** sanitize_args ( request .args ) ))
1173
1183
1174
1184
@expose ("/dags/<string:dag_id>/code" )
1175
1185
@auth .has_access (
@@ -1216,7 +1226,7 @@ def code(self, dag_id, session=None):
1216
1226
)
1217
1227
def legacy_dag_details (self ):
1218
1228
"""Redirect from url param."""
1219
- return redirect (url_for ("Airflow.dag_details" , ** request .args ))
1229
+ return redirect (url_for ("Airflow.dag_details" , ** sanitize_args ( request .args ) ))
1220
1230
1221
1231
@expose ("/dags/<string:dag_id>/details" )
1222
1232
@auth .has_access (
@@ -2628,7 +2638,7 @@ def success(self):
2628
2638
@action_logging
2629
2639
def dag (self , dag_id ):
2630
2640
"""Redirect to default DAG view."""
2631
- kwargs = {** request .args , "dag_id" : dag_id }
2641
+ kwargs = {** sanitize_args ( request .args ) , "dag_id" : dag_id }
2632
2642
return redirect (url_for ("Airflow.grid" , ** kwargs ))
2633
2643
2634
2644
@expose ("/legacy_tree" )
@@ -2643,7 +2653,7 @@ def dag(self, dag_id):
2643
2653
@action_logging
2644
2654
def legacy_tree (self ):
2645
2655
"""Redirect to the replacement - grid view."""
2646
- return redirect (url_for ("Airflow.grid" , ** request .args ))
2656
+ return redirect (url_for ("Airflow.grid" , ** sanitize_args ( request .args ) ))
2647
2657
2648
2658
@expose ("/tree" )
2649
2659
@auth .has_access (
@@ -2657,7 +2667,7 @@ def legacy_tree(self):
2657
2667
@action_logging
2658
2668
def tree (self ):
2659
2669
"""Redirect to the replacement - grid view. Kept for backwards compatibility."""
2660
- return redirect (url_for ("Airflow.grid" , ** request .args ))
2670
+ return redirect (url_for ("Airflow.grid" , ** sanitize_args ( request .args ) ))
2661
2671
2662
2672
@expose ("/dags/<string:dag_id>/grid" )
2663
2673
@auth .has_access (
@@ -2736,7 +2746,7 @@ def grid(self, dag_id, session=None):
2736
2746
@action_logging
2737
2747
def legacy_calendar (self ):
2738
2748
"""Redirect from url param."""
2739
- return redirect (url_for ("Airflow.calendar" , ** request .args ))
2749
+ return redirect (url_for ("Airflow.calendar" , ** sanitize_args ( request .args ) ))
2740
2750
2741
2751
@expose ("/dags/<string:dag_id>/calendar" )
2742
2752
@auth .has_access (
@@ -2877,7 +2887,7 @@ def _convert_to_date(session, column):
2877
2887
@action_logging
2878
2888
def legacy_graph (self ):
2879
2889
"""Redirect from url param."""
2880
- return redirect (url_for ("Airflow.graph" , ** request .args ))
2890
+ return redirect (url_for ("Airflow.graph" , ** sanitize_args ( request .args ) ))
2881
2891
2882
2892
@expose ("/dags/<string:dag_id>/graph" )
2883
2893
@auth .has_access (
@@ -2994,7 +3004,7 @@ class GraphForm(DateTimeWithNumRunsWithDagRunsForm):
2994
3004
@action_logging
2995
3005
def legacy_duration (self ):
2996
3006
"""Redirect from url param."""
2997
- return redirect (url_for ("Airflow.duration" , ** request .args ))
3007
+ return redirect (url_for ("Airflow.duration" , ** sanitize_args ( request .args ) ))
2998
3008
2999
3009
@expose ("/dags/<string:dag_id>/duration" )
3000
3010
@auth .has_access (
@@ -3155,7 +3165,7 @@ def duration(self, dag_id, session=None):
3155
3165
@action_logging
3156
3166
def legacy_tries (self ):
3157
3167
"""Redirect from url param."""
3158
- return redirect (url_for ("Airflow.tries" , ** request .args ))
3168
+ return redirect (url_for ("Airflow.tries" , ** sanitize_args ( request .args ) ))
3159
3169
3160
3170
@expose ("/dags/<string:dag_id>/tries" )
3161
3171
@auth .has_access (
@@ -3250,7 +3260,7 @@ def tries(self, dag_id, session=None):
3250
3260
@action_logging
3251
3261
def legacy_landing_times (self ):
3252
3262
"""Redirect from url param."""
3253
- return redirect (url_for ("Airflow.landing_times" , ** request .args ))
3263
+ return redirect (url_for ("Airflow.landing_times" , ** sanitize_args ( request .args ) ))
3254
3264
3255
3265
@expose ("/dags/<string:dag_id>/landing-times" )
3256
3266
@auth .has_access (
@@ -3372,7 +3382,7 @@ def paused(self):
3372
3382
@action_logging
3373
3383
def legacy_gantt (self ):
3374
3384
"""Redirect from url param."""
3375
- return redirect (url_for ("Airflow.gantt" , ** request .args ))
3385
+ return redirect (url_for ("Airflow.gantt" , ** sanitize_args ( request .args ) ))
3376
3386
3377
3387
@expose ("/dags/<string:dag_id>/gantt" )
3378
3388
@auth .has_access (
@@ -3820,7 +3830,7 @@ def robots(self):
3820
3830
)
3821
3831
def legacy_audit_log (self ):
3822
3832
"""Redirect from url param."""
3823
- return redirect (url_for ("Airflow.audit_log" , ** request .args ))
3833
+ return redirect (url_for ("Airflow.audit_log" , ** sanitize_args ( request .args ) ))
3824
3834
3825
3835
@expose ("/dags/<string:dag_id>/audit_log" )
3826
3836
@auth .has_access (
0 commit comments