82
82
logout_user = airflow .login .logout_user
83
83
84
84
FILTER_BY_OWNER = False
85
+
86
+ DEFAULT_SENSITIVE_VARIABLE_FIELDS = (
87
+ 'password' ,
88
+ 'secret' ,
89
+ 'passwd' ,
90
+ 'authorization' ,
91
+ 'api_key' ,
92
+ 'apikey' ,
93
+ 'access_token' ,
94
+ )
95
+
85
96
if conf .getboolean ('webserver' , 'FILTER_BY_OWNER' ):
86
97
# filter_by_owner if authentication is enabled and filter_by_owner is true
87
98
FILTER_BY_OWNER = not current_app .config ['LOGIN_DISABLED' ]
@@ -265,6 +276,11 @@ def recurse_tasks(tasks, task_ids, dag_ids, task_id_to_dag):
265
276
task_id_to_dag [tasks .task_id ] = tasks .dag
266
277
267
278
279
+ def should_hide_value_for_key (key_name ):
280
+ return any (s in key_name for s in DEFAULT_SENSITIVE_VARIABLE_FIELDS ) \
281
+ and conf .getboolean ('admin' , 'hide_sensitive_variable_fields' )
282
+
283
+
268
284
class Airflow (BaseView ):
269
285
270
286
def is_visible (self ):
@@ -2015,11 +2031,17 @@ class DagPickleView(SuperUserMixin, ModelView):
2015
2031
class VariableView (wwwutils .LoginMixin , AirflowModelView ):
2016
2032
verbose_name = "Variable"
2017
2033
verbose_name_plural = "Variables"
2034
+
2035
+ def hidden_field_formatter (view , context , model , name ):
2036
+ if should_hide_value_for_key (model .key ):
2037
+ return Markup ('*' * 8 )
2038
+ return getattr (model , name )
2039
+
2018
2040
form_columns = (
2019
2041
'key' ,
2020
2042
'val' ,
2021
2043
)
2022
- column_list = ('key' , 'is_encrypted' ,)
2044
+ column_list = ('key' , 'val' , ' is_encrypted' ,)
2023
2045
column_filters = ('key' , 'val' )
2024
2046
column_searchable_list = ('key' , 'val' )
2025
2047
form_widget_args = {
@@ -2028,6 +2050,18 @@ class VariableView(wwwutils.LoginMixin, AirflowModelView):
2028
2050
'rows' : 20 ,
2029
2051
}
2030
2052
}
2053
+ column_sortable_list = (
2054
+ 'key' ,
2055
+ 'val' ,
2056
+ 'is_encrypted' ,
2057
+ )
2058
+ column_formatters = {
2059
+ 'val' : hidden_field_formatter
2060
+ }
2061
+
2062
+ def on_form_prefill (self , form , id ):
2063
+ if should_hide_value_for_key (form .key .data ):
2064
+ form .val .data = '*' * 8
2031
2065
2032
2066
2033
2067
class JobModelView (ModelViewOnly ):
0 commit comments