Skip to content

Commit fee9689

Browse files
committed
Allow Fleet post secret and get secret to accept array of strings
1 parent 376aad0 commit fee9689

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/action/GetSecretResponse.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,19 @@
2020
public class GetSecretResponse extends ActionResponse implements ToXContentObject {
2121

2222
private final String id;
23-
private final String value;
23+
private final Object value;
2424

2525
public GetSecretResponse(StreamInput in) throws IOException {
2626
super(in);
2727
id = in.readString();
28-
value = in.readString();
28+
if (in.readByte() == 0) {
29+
value = in.readString();
30+
} else {
31+
value = in.readStringArray();
32+
}
2933
}
3034

31-
public GetSecretResponse(String id, String value) {
35+
public GetSecretResponse(String id, Object value) {
3236
this.id = id;
3337
this.value = value;
3438
}
@@ -40,15 +44,24 @@ public String id() {
4044
@Override
4145
public void writeTo(StreamOutput out) throws IOException {
4246
out.writeString(id);
43-
out.writeString(value);
47+
if (value instanceof String) {
48+
out.writeString((String) value);
49+
} else if (value instanceof String[]) {
50+
out.writeStringArray((String[]) value);
51+
}
4452
}
4553

4654
@Override
4755
public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException {
4856
builder.startObject();
4957
builder.field("id", id);
50-
builder.field("value", value);
51-
return builder.endObject();
58+
if (value instanceof String) {
59+
builder.field("value", (String) value);
60+
} else if (value instanceof String[]) {
61+
builder.field("value", (String[]) value);
62+
}
63+
builder.endObject();
64+
return builder;
5265
}
5366

5467
@Override

x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/action/PostSecretRequest.java

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,49 +27,71 @@ public class PostSecretRequest extends ActionRequest {
2727
public static final ConstructingObjectParser<PostSecretRequest, Void> PARSER = new ConstructingObjectParser<>(
2828
"post_secret_request",
2929
args -> {
30-
return new PostSecretRequest((String) args[0]);
30+
return new PostSecretRequest(args[0]);
3131
}
3232
);
3333

3434
static {
3535
PARSER.declareField(
3636
ConstructingObjectParser.optionalConstructorArg(),
37-
(p, c) -> p.text(),
37+
(p, c) -> {
38+
if (p.currentToken() == XContentParser.Token.VALUE_STRING) {
39+
return p.text();
40+
} else if (p.currentToken() == XContentParser.Token.START_ARRAY) {
41+
return p.list().stream().map(s -> (String) s).toArray(String[]::new);
42+
} else {
43+
throw new IllegalArgumentException("Unexpected token: " + p.currentToken());
44+
}
45+
},
3846
VALUE_FIELD,
39-
ObjectParser.ValueType.STRING
47+
ObjectParser.ValueType.STRING_ARRAY
4048
);
4149
}
4250

4351
public static PostSecretRequest fromXContent(XContentParser parser) throws IOException {
4452
return PARSER.parse(parser, null);
4553
}
4654

47-
private final String value;
55+
private final Object value;
4856

49-
public PostSecretRequest(String value) {
57+
public PostSecretRequest(Object value) {
5058
this.value = value;
5159
}
5260

5361
public PostSecretRequest(StreamInput in) throws IOException {
5462
super(in);
55-
this.value = in.readString();
63+
if (in.readByte() == 0) {
64+
this.value = in.readString();
65+
} else {
66+
this.value = in.readStringArray();
67+
}
5668
}
5769

58-
public String value() {
70+
public Object value() {
5971
return value;
6072
}
6173

6274
public XContentBuilder toXContent(XContentBuilder builder) throws IOException {
6375
builder.startObject();
64-
builder.field(VALUE_FIELD.getPreferredName(), this.value);
76+
if (value instanceof String) {
77+
builder.field(VALUE_FIELD.getPreferredName(), (String) value);
78+
} else if (value instanceof String[]) {
79+
builder.field(VALUE_FIELD.getPreferredName(), (String[]) value);
80+
}
6581
builder.endObject();
6682
return builder;
6783
}
6884

6985
@Override
7086
public void writeTo(StreamOutput out) throws IOException {
7187
super.writeTo(out);
72-
out.writeString(value);
88+
if (value instanceof String) {
89+
out.writeBoolean(true);
90+
out.writeString((String) value);
91+
} else if (value instanceof String[]) {
92+
out.writeBoolean(false);
93+
out.writeStringArray((String[]) value);
94+
}
7395
}
7496

7597
@Override

x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/action/TransportGetSecretAction.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import static org.elasticsearch.xpack.core.ClientHelper.FLEET_ORIGIN;
2222
import static org.elasticsearch.xpack.fleet.Fleet.FLEET_SECRETS_INDEX_NAME;
2323

24+
import java.util.List;
25+
2426
public class TransportGetSecretAction extends HandledTransportAction<GetSecretRequest, GetSecretResponse> {
2527
private final Client client;
2628

@@ -36,7 +38,19 @@ protected void doExecute(Task task, GetSecretRequest request, ActionListener<Get
3638
delegate.onFailure(new ResourceNotFoundException("No secret with id [" + request.id() + "]"));
3739
return;
3840
}
39-
delegate.onResponse(new GetSecretResponse(getResponse.getId(), getResponse.getSource().get("value").toString()));
41+
Object value = getResponse.getSource().get("value");
42+
if (value instanceof String) {
43+
delegate.onResponse(new GetSecretResponse(getResponse.getId(), value.toString()));
44+
} else if (value instanceof List) {
45+
List<?> valueList = (List<?>) value;
46+
if (valueList.stream().allMatch(item -> item instanceof String)) {
47+
delegate.onResponse(new GetSecretResponse(getResponse.getId(), valueList.toArray(new String[0])));
48+
} else {
49+
delegate.onFailure(new IllegalArgumentException("Unexpected value type in list for id [" + request.id() + "]"));
50+
}
51+
} else {
52+
delegate.onFailure(new IllegalArgumentException("Unexpected value type for id [" + request.id() + "]"));
53+
}
4054
}));
4155
}
4256
}

0 commit comments

Comments
 (0)