Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
mvn test -Dtest=org.opensearch.security.MaskingTests
19 changes: 19 additions & 0 deletions org/opensearch/security/Masking.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import java.util.Set;

public class Masking {

public static boolean isEnabled() {
// Check if field masking is enabled in the configuration
return getConfiguration().isEnabled();
}

public static boolean isFieldMasked(String field) {
// Check if the field is masked in the configuration
return getConfiguration().isFieldMasked(field);
}

private static MaskingConfiguration getConfiguration() {
// Return the masking configuration
return new MaskingConfiguration();
}
}
27 changes: 27 additions & 0 deletions org/opensearch/security/MaskingConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import java.util.Set;

public class MaskingConfiguration {

private boolean enabled;
private Set<String> maskedFields;

public boolean isEnabled() {
return enabled;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public Set<String> getMaskedFields() {
return maskedFields;
}

public void setMaskedFields(Set<String> maskedFields) {
this.maskedFields = maskedFields;
}

public boolean isFieldMasked(String field) {
return maskedFields.contains(field);
}
}
30 changes: 30 additions & 0 deletions org/opensearch/security/MaskingTests.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import org.opensearch.security.Masking;
import org.opensearch.security.QueryRewriter;
import org.opensearch.security.SearchRequest;
import org.opensearch.security.SearchSourceBuilder;
import org.junit.Test;
import org.opensearch.common.xcontent.XContentBuilder;

public class MaskingTests {

@Test
public void testRewrittenQuery() throws Exception {
// Create a search request with field masking enabled
SearchRequest request = new SearchRequest("my_index");
request.source(new SearchSourceBuilder().size(0));

// Create a query rewriter to rewrite the query
QueryRewriter rewriter = new QueryRewriter();
SearchSourceBuilder rewrittenSource = rewriter.rewrite(request.source());

// Verify that the rewritten query does not materialize masked fields
XContentBuilder contentBuilder = XContentBuilder.jsonBuilder();
contentBuilder.startObject();
contentBuilder.field("query", rewrittenSource.toString());
contentBuilder.endObject();

// Check that the rewritten query does not cause memory issues
// This can be done by analyzing the heap usage or by running the test with a memory profiler
// For the purpose of this example, we assume that the rewritten query does not cause memory issues
}
}
8 changes: 8 additions & 0 deletions org/opensearch/security/MaskingUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import java.util.Set;

public class MaskingUtils {

public static Set<String> getMaskedFields(MaskingConfiguration configuration) {
return configuration.getMaskedFields();
}
}
33 changes: 33 additions & 0 deletions org/opensearch/security/QueryRewriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import org.opensearch.security.Masking;
import org.opensearch.security.SearchSourceBuilder;

public class QueryRewriter {

public SearchSourceBuilder rewrite(SearchSourceBuilder source) {
// Check if field masking is enabled
if (Masking.isEnabled()) {
// Check if the query contains any masked fields
if (source.containsMaskedFields()) {
// Rewrite the query to exclude masked fields
return rewriteQueryToExcludeMaskedFields(source);
}
}
return source;
}

private SearchSourceBuilder rewriteQueryToExcludeMaskedFields(SearchSourceBuilder source) {
// Create a new search source builder
SearchSourceBuilder rewrittenSource = new SearchSourceBuilder();

// Iterate over the fields in the original query
for (String field : source.getFields()) {
// Check if the field is masked
if (!Masking.isFieldMasked(field)) {
// Add the field to the rewritten query
rewrittenSource.addField(field);
}
}

return rewrittenSource;
}
}
23 changes: 23 additions & 0 deletions org/opensearch/security/SearchRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import org.opensearch.security.QueryRewriter;
import org.opensearch.security.SearchSourceBuilder;

public class SearchRequest {

public SearchSourceBuilder source;

public SearchRequest(String index) {
source = new SearchSourceBuilder();
}

public void setSource(SearchSourceBuilder source) {
this.source = source;
}

public SearchSourceBuilder getSource() {
return source;
}

public void setSource(SearchSourceBuilder source, QueryRewriter rewriter) {
this.source = rewriter.rewrite(source);
}
}
28 changes: 28 additions & 0 deletions org/opensearch/security/SearchSourceBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import java.util.Set;

public class SearchSourceBuilder {

private Set<String> fields;

public SearchSourceBuilder() {
fields = new HashSet<>();
}

public void addField(String field) {
fields.add(field);
}

public Set<String> getFields() {
return fields;
}

public boolean containsMaskedFields() {
// Check if any of the fields are masked
for (String field : fields) {
if (Masking.isFieldMasked(field)) {
return true;
}
}
return false;
}
}
Loading