72
72
import org .opensearch .search .internal .SearchContext ;
73
73
import org .opensearch .search .query .QuerySearchResult ;
74
74
import org .opensearch .security .OpenSearchSecurityPlugin ;
75
- import org .opensearch .security .resolver .IndexResolverReplacer .Resolved ;
75
+ import org .opensearch .security .privileges .PrivilegesEvaluationContext ;
76
+ import org .opensearch .security .resolver .IndexResolverReplacer ;
77
+ import org .opensearch .security .securityconf .ConfigModel ;
76
78
import org .opensearch .security .securityconf .EvaluatedDlsFlsConfig ;
77
79
import org .opensearch .security .support .Base64Helper ;
78
80
import org .opensearch .security .support .ConfigConstants ;
79
81
import org .opensearch .security .support .HeaderHelper ;
80
82
import org .opensearch .security .support .SecurityUtils ;
81
83
import org .opensearch .threadpool .ThreadPool ;
82
84
85
+ import org .greenrobot .eventbus .Subscribe ;
86
+
83
87
public class DlsFlsValveImpl implements DlsFlsRequestValve {
84
88
85
89
private static final String MAP_EXECUTION_HINT = "map" ;
@@ -91,6 +95,9 @@ public class DlsFlsValveImpl implements DlsFlsRequestValve {
91
95
private final Mode mode ;
92
96
private final DlsQueryParser dlsQueryParser ;
93
97
private final IndexNameExpressionResolver resolver ;
98
+ private final boolean dfmEmptyOverwritesAll ;
99
+ private final NamedXContentRegistry namedXContentRegistry ;
100
+ private volatile ConfigModel configModel ;
94
101
95
102
public DlsFlsValveImpl (
96
103
Settings settings ,
@@ -107,21 +114,29 @@ public DlsFlsValveImpl(
107
114
this .threadContext = threadContext ;
108
115
this .mode = Mode .get (settings );
109
116
this .dlsQueryParser = new DlsQueryParser (namedXContentRegistry );
117
+ this .dfmEmptyOverwritesAll = settings .getAsBoolean (ConfigConstants .SECURITY_DFM_EMPTY_OVERRIDES_ALL , false );
118
+ this .namedXContentRegistry = namedXContentRegistry ;
119
+ }
120
+
121
+ @ Subscribe
122
+ public void onConfigModelChanged (ConfigModel configModel ) {
123
+ this .configModel = configModel ;
110
124
}
111
125
112
126
/**
113
127
*
114
- * @param request
115
128
* @param listener
116
129
* @return false on error
117
130
*/
118
- public boolean invoke (
119
- String action ,
120
- ActionRequest request ,
121
- final ActionListener <?> listener ,
122
- EvaluatedDlsFlsConfig evaluatedDlsFlsConfig ,
123
- final Resolved resolved
124
- ) {
131
+ @ Override
132
+ public boolean invoke (PrivilegesEvaluationContext context , final ActionListener <?> listener ) {
133
+
134
+ EvaluatedDlsFlsConfig evaluatedDlsFlsConfig = configModel .getSecurityRoles ()
135
+ .filter (context .getMappedRoles ())
136
+ .getDlsFls (context .getUser (), dfmEmptyOverwritesAll , resolver , clusterService , namedXContentRegistry );
137
+
138
+ ActionRequest request = context .getRequest ();
139
+ IndexResolverReplacer .Resolved resolved = context .getResolvedRequest ();
125
140
126
141
if (log .isDebugEnabled ()) {
127
142
log .debug (
@@ -288,7 +303,7 @@ public boolean invoke(
288
303
return false ;
289
304
}
290
305
291
- if (action .contains ("plugins/replication" )) {
306
+ if (context . getAction () .contains ("plugins/replication" )) {
292
307
listener .onFailure (
293
308
new OpenSearchSecurityException (
294
309
"Cross Cluster Replication is not supported when FLS or DLS or Fieldmasking is activated" ,
@@ -324,11 +339,9 @@ public boolean invoke(
324
339
325
340
if (doFilterLevelDls && filteredDlsFlsConfig .hasDls ()) {
326
341
return DlsFilterLevelActionHandler .handle (
327
- action ,
328
- request ,
329
- listener ,
342
+ context ,
330
343
evaluatedDlsFlsConfig ,
331
- resolved ,
344
+ listener ,
332
345
nodeClient ,
333
346
clusterService ,
334
347
OpenSearchSecurityPlugin .GuiceHolder .getIndicesService (),
0 commit comments