|
32 | 32 | import org.opensearch.action.admin.indices.refresh.RefreshRequest; |
33 | 33 | import org.opensearch.action.bulk.BulkRequest; |
34 | 34 | import org.opensearch.action.delete.DeleteRequest; |
| 35 | +import org.opensearch.action.get.GetRequest; |
35 | 36 | import org.opensearch.action.get.MultiGetRequest; |
36 | 37 | import org.opensearch.action.get.MultiGetRequest.Item; |
37 | 38 | import org.opensearch.action.index.IndexRequest; |
@@ -141,13 +142,19 @@ public ReplaceResult replaceDashboardsIndex( |
141 | 142 | && resolveToDashboardsIndexOrAlias(requestedResolved, dashboardsIndexName); |
142 | 143 | final boolean isTraceEnabled = log.isTraceEnabled(); |
143 | 144 |
|
| 145 | + |
144 | 146 | TenantPrivileges.ActionType actionType = getActionTypeForAction(action); |
145 | 147 |
|
146 | 148 | if (requestedTenant == null || requestedTenant.length() == 0) { |
147 | 149 | if (isTraceEnabled) { |
148 | 150 | log.trace("No tenant, will resolve to " + dashboardsIndexName); |
149 | 151 | } |
150 | 152 |
|
| 153 | + // Intercept when request is dashboards user and request is to get advanced settings. No replacement. |
| 154 | + if ("osd:admin/advanced_settings".equals(action)) { |
| 155 | + return ACCESS_GRANTED_REPLACE_RESULT; |
| 156 | + } |
| 157 | + |
151 | 158 | if (dashboardsIndexOnly && !tenantPrivileges.hasTenantPrivilege(context, "global_tenant", actionType)) { |
152 | 159 | return ACCESS_DENIED_REPLACE_RESULT; |
153 | 160 | } |
@@ -199,6 +206,20 @@ public ReplaceResult replaceDashboardsIndex( |
199 | 206 |
|
200 | 207 | final String tenantIndexName = toUserIndexName(dashboardsIndexName, requestedTenant); |
201 | 208 |
|
| 209 | + System.out.println("tenantIndexName: " + tenantIndexName); |
| 210 | + System.out.println("user: " + user); |
| 211 | + System.out.println("action: " + action); |
| 212 | + System.out.println("requestResolved: " + requestedResolved.getAllIndices()); |
| 213 | + if (request instanceof GetRequest gr) { |
| 214 | + System.out.println("GetRequest: " + gr.id()); |
| 215 | + } else if (request instanceof SearchRequest sr) { |
| 216 | + System.out.println("SearchRequest: " + sr.source().toString()); |
| 217 | + } |
| 218 | + // Intercept when request is dashboards user and request is to get advanced settings |
| 219 | + if ("osd:admin/advanced_settings".equals(action)) { |
| 220 | + return newAccessGrantedReplaceResult(replaceIndex(request, dashboardsIndexName, tenantIndexName, action)); |
| 221 | + } |
| 222 | + |
202 | 223 | // The new DLS/FLS implementation defaults to a "deny all" pattern in case no roles are configured |
203 | 224 | // for an index. As the PrivilegeInterceptor grants access to indices bypassing index privileges, |
204 | 225 | // we need to allow-list these indices. |
@@ -233,7 +254,9 @@ private void applyDocumentAllowList(String indexName) { |
233 | 254 | } |
234 | 255 |
|
235 | 256 | static TenantPrivileges.ActionType getActionTypeForAction(String action) { |
236 | | - if (READ_ONLY_ALLOWED_ACTIONS.contains(action)) { |
| 257 | + if ("osd:admin/advanced_settings".equals(action)) { |
| 258 | + return TenantPrivileges.ActionType.ADMIN; |
| 259 | + } else if (READ_ONLY_ALLOWED_ACTIONS.contains(action)) { |
237 | 260 | return TenantPrivileges.ActionType.READ; |
238 | 261 | } else { |
239 | 262 | return TenantPrivileges.ActionType.WRITE; |
|
0 commit comments