HLRC: Add delete user action (#35294)
* HLRC: Add delete user action It adds delete user action to the high level rest client. Relates #29827
This commit is contained in:
parent
e0a678f0c4
commit
93ed8b7d61
|
@ -35,6 +35,8 @@ import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleMappingResponse;
|
import org.elasticsearch.client.security.DeleteRoleMappingResponse;
|
||||||
import org.elasticsearch.client.security.DeleteRoleRequest;
|
import org.elasticsearch.client.security.DeleteRoleRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleResponse;
|
import org.elasticsearch.client.security.DeleteRoleResponse;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserRequest;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserResponse;
|
||||||
import org.elasticsearch.client.security.DisableUserRequest;
|
import org.elasticsearch.client.security.DisableUserRequest;
|
||||||
import org.elasticsearch.client.security.EmptyResponse;
|
import org.elasticsearch.client.security.EmptyResponse;
|
||||||
import org.elasticsearch.client.security.EnableUserRequest;
|
import org.elasticsearch.client.security.EnableUserRequest;
|
||||||
|
@ -102,6 +104,33 @@ public final class SecurityClient {
|
||||||
PutUserResponse::fromXContent, listener, emptySet());
|
PutUserResponse::fromXContent, listener, emptySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes user from the native realm synchronously.
|
||||||
|
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-delete-user.html">
|
||||||
|
* the docs</a> for more.
|
||||||
|
* @param request the request with the user to delete
|
||||||
|
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
|
||||||
|
* @return the response from the delete user call
|
||||||
|
* @throws IOException in case there is a problem sending the request or parsing back the response
|
||||||
|
*/
|
||||||
|
public DeleteUserResponse deleteUser(DeleteUserRequest request, RequestOptions options) throws IOException {
|
||||||
|
return restHighLevelClient.performRequestAndParseEntity(request, SecurityRequestConverters::deleteUser, options,
|
||||||
|
DeleteUserResponse::fromXContent, singleton(404));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronously deletes a user in the native realm.
|
||||||
|
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-delete-user.html">
|
||||||
|
* the docs</a> for more.
|
||||||
|
* @param request the request with the user to delete
|
||||||
|
* @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
|
||||||
|
* @param listener the listener to be notified upon request completion
|
||||||
|
*/
|
||||||
|
public void deleteUserAsync(DeleteUserRequest request, RequestOptions options, ActionListener<DeleteUserResponse> listener) {
|
||||||
|
restHighLevelClient.performRequestAsyncAndParseEntity(request, SecurityRequestConverters::deleteUser, options,
|
||||||
|
DeleteUserResponse::fromXContent, listener, singleton(404));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create/Update a role mapping.
|
* Create/Update a role mapping.
|
||||||
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role-mapping.html">
|
* See <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role-mapping.html">
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.elasticsearch.client.security.DeletePrivilegesRequest;
|
||||||
import org.elasticsearch.client.security.GetPrivilegesRequest;
|
import org.elasticsearch.client.security.GetPrivilegesRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleRequest;
|
import org.elasticsearch.client.security.DeleteRoleRequest;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserRequest;
|
||||||
import org.elasticsearch.client.security.InvalidateTokenRequest;
|
import org.elasticsearch.client.security.InvalidateTokenRequest;
|
||||||
import org.elasticsearch.client.security.GetRolesRequest;
|
import org.elasticsearch.client.security.GetRolesRequest;
|
||||||
import org.elasticsearch.client.security.PutRoleMappingRequest;
|
import org.elasticsearch.client.security.PutRoleMappingRequest;
|
||||||
|
@ -76,6 +77,17 @@ final class SecurityRequestConverters {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Request deleteUser(DeleteUserRequest deleteUserRequest) {
|
||||||
|
String endpoint = new RequestConverters.EndpointBuilder()
|
||||||
|
.addPathPartAsIs("_xpack","security", "user")
|
||||||
|
.addPathPart(deleteUserRequest.getName())
|
||||||
|
.build();
|
||||||
|
Request request = new Request(HttpDelete.METHOD_NAME, endpoint);
|
||||||
|
RequestConverters.Params params = new RequestConverters.Params(request);
|
||||||
|
params.withRefreshPolicy(deleteUserRequest.getRefreshPolicy());
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
static Request putRoleMapping(final PutRoleMappingRequest putRoleMappingRequest) throws IOException {
|
static Request putRoleMapping(final PutRoleMappingRequest putRoleMappingRequest) throws IOException {
|
||||||
final String endpoint = new RequestConverters.EndpointBuilder()
|
final String endpoint = new RequestConverters.EndpointBuilder()
|
||||||
.addPathPartAsIs("_xpack/security/role_mapping")
|
.addPathPartAsIs("_xpack/security/role_mapping")
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.client.security;
|
||||||
|
|
||||||
|
import org.elasticsearch.client.Validatable;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A request to delete a user from the native realm.
|
||||||
|
*/
|
||||||
|
public final class DeleteUserRequest implements Validatable {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final RefreshPolicy refreshPolicy;
|
||||||
|
|
||||||
|
public DeleteUserRequest(String name) {
|
||||||
|
this(name, RefreshPolicy.IMMEDIATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeleteUserRequest(String name, RefreshPolicy refreshPolicy) {
|
||||||
|
this.name = Objects.requireNonNull(name, "user name is required");
|
||||||
|
this.refreshPolicy = Objects.requireNonNull(refreshPolicy, "refresh policy is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RefreshPolicy getRefreshPolicy() {
|
||||||
|
return refreshPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(name, refreshPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getClass() != obj.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final DeleteUserRequest other = (DeleteUserRequest) obj;
|
||||||
|
|
||||||
|
return (refreshPolicy == other.refreshPolicy) && Objects.equals(name, other.name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.client.security;
|
||||||
|
|
||||||
|
import org.elasticsearch.client.core.AcknowledgedResponse;
|
||||||
|
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Response for a user being deleted from the native realm
|
||||||
|
*/
|
||||||
|
public final class DeleteUserResponse extends AcknowledgedResponse {
|
||||||
|
|
||||||
|
private static final String PARSE_FIELD_NAME = "found";
|
||||||
|
|
||||||
|
private static final ConstructingObjectParser<DeleteUserResponse, Void> PARSER = AcknowledgedResponse
|
||||||
|
.generateParser("delete_user_response", DeleteUserResponse::new, PARSE_FIELD_NAME);
|
||||||
|
|
||||||
|
public DeleteUserResponse(boolean acknowledged) {
|
||||||
|
super(acknowledged);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DeleteUserResponse fromXContent(final XContentParser parser) throws IOException {
|
||||||
|
return PARSER.parse(parser, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getFieldName() {
|
||||||
|
return PARSE_FIELD_NAME;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,8 @@ package org.elasticsearch.client;
|
||||||
import org.apache.http.client.methods.HttpDelete;
|
import org.apache.http.client.methods.HttpDelete;
|
||||||
import org.elasticsearch.ElasticsearchStatusException;
|
import org.elasticsearch.ElasticsearchStatusException;
|
||||||
import org.elasticsearch.client.security.AuthenticateResponse;
|
import org.elasticsearch.client.security.AuthenticateResponse;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserRequest;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserResponse;
|
||||||
import org.elasticsearch.client.security.PutUserRequest;
|
import org.elasticsearch.client.security.PutUserRequest;
|
||||||
import org.elasticsearch.client.security.PutUserResponse;
|
import org.elasticsearch.client.security.PutUserResponse;
|
||||||
import org.elasticsearch.client.security.RefreshPolicy;
|
import org.elasticsearch.client.security.RefreshPolicy;
|
||||||
|
@ -74,14 +76,22 @@ public class SecurityIT extends ESRestHighLevelClientTestCase {
|
||||||
assertThat(authenticateResponse.enabled(), is(true));
|
assertThat(authenticateResponse.enabled(), is(true));
|
||||||
|
|
||||||
// delete user
|
// delete user
|
||||||
final Request deleteUserRequest = new Request(HttpDelete.METHOD_NAME,
|
final DeleteUserRequest deleteUserRequest =
|
||||||
"/_xpack/security/user/" + putUserRequest.getUser().getUsername());
|
new DeleteUserRequest(putUserRequest.getUser().getUsername(), putUserRequest.getRefreshPolicy());
|
||||||
highLevelClient().getLowLevelClient().performRequest(deleteUserRequest);
|
|
||||||
|
final DeleteUserResponse deleteUserResponse =
|
||||||
|
execute(deleteUserRequest, securityClient::deleteUser, securityClient::deleteUserAsync);
|
||||||
|
assertThat(deleteUserResponse.isAcknowledged(), is(true));
|
||||||
|
|
||||||
// authentication no longer works
|
// authentication no longer works
|
||||||
ElasticsearchStatusException e = expectThrows(ElasticsearchStatusException.class, () -> execute(securityClient::authenticate,
|
ElasticsearchStatusException e = expectThrows(ElasticsearchStatusException.class, () -> execute(securityClient::authenticate,
|
||||||
securityClient::authenticateAsync, authorizationRequestOptions(basicAuthHeader)));
|
securityClient::authenticateAsync, authorizationRequestOptions(basicAuthHeader)));
|
||||||
assertThat(e.getMessage(), containsString("unable to authenticate user [" + putUserRequest.getUser().getUsername() + "]"));
|
assertThat(e.getMessage(), containsString("unable to authenticate user [" + putUserRequest.getUser().getUsername() + "]"));
|
||||||
|
|
||||||
|
// delete non-existing user
|
||||||
|
final DeleteUserResponse deleteUserResponse2 =
|
||||||
|
execute(deleteUserRequest, securityClient::deleteUser, securityClient::deleteUserAsync);
|
||||||
|
assertThat(deleteUserResponse2.isAcknowledged(), is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static User randomUser() {
|
private static User randomUser() {
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.elasticsearch.client.security.CreateTokenRequest;
|
||||||
import org.elasticsearch.client.security.DeletePrivilegesRequest;
|
import org.elasticsearch.client.security.DeletePrivilegesRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleRequest;
|
import org.elasticsearch.client.security.DeleteRoleRequest;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserRequest;
|
||||||
import org.elasticsearch.client.security.DisableUserRequest;
|
import org.elasticsearch.client.security.DisableUserRequest;
|
||||||
import org.elasticsearch.client.security.EnableUserRequest;
|
import org.elasticsearch.client.security.EnableUserRequest;
|
||||||
import org.elasticsearch.client.security.GetPrivilegesRequest;
|
import org.elasticsearch.client.security.GetPrivilegesRequest;
|
||||||
|
@ -80,6 +81,18 @@ public class SecurityRequestConvertersTests extends ESTestCase {
|
||||||
assertToXContentBody(putUserRequest, request.getEntity());
|
assertToXContentBody(putUserRequest, request.getEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testDeleteUser() {
|
||||||
|
final String name = randomAlphaOfLengthBetween(4, 12);
|
||||||
|
final RefreshPolicy refreshPolicy = randomFrom(RefreshPolicy.values());
|
||||||
|
final Map<String, String> expectedParams = getExpectedParamsFromRefreshPolicy(refreshPolicy);
|
||||||
|
DeleteUserRequest deleteUserRequest = new DeleteUserRequest(name, refreshPolicy);
|
||||||
|
Request request = SecurityRequestConverters.deleteUser(deleteUserRequest);
|
||||||
|
assertEquals(HttpDelete.METHOD_NAME, request.getMethod());
|
||||||
|
assertEquals("/_xpack/security/user/" + name, request.getEndpoint());
|
||||||
|
assertEquals(expectedParams, request.getParameters());
|
||||||
|
assertNull(request.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
public void testPutRoleMapping() throws IOException {
|
public void testPutRoleMapping() throws IOException {
|
||||||
final String username = randomAlphaOfLengthBetween(4, 7);
|
final String username = randomAlphaOfLengthBetween(4, 7);
|
||||||
final String rolename = randomAlphaOfLengthBetween(4, 7);
|
final String rolename = randomAlphaOfLengthBetween(4, 7);
|
||||||
|
|
|
@ -45,6 +45,8 @@ import org.elasticsearch.client.security.DeleteRoleMappingRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleMappingResponse;
|
import org.elasticsearch.client.security.DeleteRoleMappingResponse;
|
||||||
import org.elasticsearch.client.security.DeleteRoleRequest;
|
import org.elasticsearch.client.security.DeleteRoleRequest;
|
||||||
import org.elasticsearch.client.security.DeleteRoleResponse;
|
import org.elasticsearch.client.security.DeleteRoleResponse;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserRequest;
|
||||||
|
import org.elasticsearch.client.security.DeleteUserResponse;
|
||||||
import org.elasticsearch.client.security.DisableUserRequest;
|
import org.elasticsearch.client.security.DisableUserRequest;
|
||||||
import org.elasticsearch.client.security.EmptyResponse;
|
import org.elasticsearch.client.security.EmptyResponse;
|
||||||
import org.elasticsearch.client.security.EnableUserRequest;
|
import org.elasticsearch.client.security.EnableUserRequest;
|
||||||
|
@ -185,6 +187,67 @@ public class SecurityDocumentationIT extends ESRestHighLevelClientTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testDeleteUser() throws Exception {
|
||||||
|
RestHighLevelClient client = highLevelClient();
|
||||||
|
addUser(client, "testUser", "testPassword");
|
||||||
|
|
||||||
|
{
|
||||||
|
// tag::delete-user-request
|
||||||
|
DeleteUserRequest deleteUserRequest = new DeleteUserRequest(
|
||||||
|
"testUser"); // <1>
|
||||||
|
// end::delete-user-request
|
||||||
|
|
||||||
|
// tag::delete-user-execute
|
||||||
|
DeleteUserResponse deleteUserResponse = client.security().deleteUser(deleteUserRequest, RequestOptions.DEFAULT);
|
||||||
|
// end::delete-user-execute
|
||||||
|
|
||||||
|
// tag::delete-user-response
|
||||||
|
boolean found = deleteUserResponse.isAcknowledged(); // <1>
|
||||||
|
// end::delete-user-response
|
||||||
|
assertTrue(found);
|
||||||
|
|
||||||
|
// check if deleting the already deleted user again will give us a different response
|
||||||
|
deleteUserResponse = client.security().deleteUser(deleteUserRequest, RequestOptions.DEFAULT);
|
||||||
|
assertFalse(deleteUserResponse.isAcknowledged());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
DeleteUserRequest deleteUserRequest = new DeleteUserRequest("testUser", RefreshPolicy.IMMEDIATE);
|
||||||
|
|
||||||
|
ActionListener<DeleteUserResponse> listener;
|
||||||
|
//tag::delete-user-execute-listener
|
||||||
|
listener = new ActionListener<DeleteUserResponse>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(DeleteUserResponse deleteUserResponse) {
|
||||||
|
// <1>
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Exception e) {
|
||||||
|
// <2>
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//end::delete-user-execute-listener
|
||||||
|
|
||||||
|
// Replace the empty listener by a blocking listener in test
|
||||||
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
listener = new LatchedActionListener<>(listener, latch);
|
||||||
|
|
||||||
|
//tag::delete-user-execute-async
|
||||||
|
client.security().deleteUserAsync(deleteUserRequest, RequestOptions.DEFAULT, listener); // <1>
|
||||||
|
//end::delete-user-execute-async
|
||||||
|
|
||||||
|
assertTrue(latch.await(30L, TimeUnit.SECONDS));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addUser(RestHighLevelClient client, String userName, String password) throws IOException {
|
||||||
|
User user = new User(userName, Collections.singletonList(userName));
|
||||||
|
PutUserRequest request = new PutUserRequest(user, password.toCharArray(), true, RefreshPolicy.NONE);
|
||||||
|
PutUserResponse response = client.security().putUser(request, RequestOptions.DEFAULT);
|
||||||
|
assertTrue(response.isCreated());
|
||||||
|
}
|
||||||
|
|
||||||
public void testPutRoleMapping() throws Exception {
|
public void testPutRoleMapping() throws Exception {
|
||||||
final RestHighLevelClient client = highLevelClient();
|
final RestHighLevelClient client = highLevelClient();
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.elasticsearch.client.security;
|
package org.elasticsearch.client.security;
|
||||||
|
|
||||||
import org.elasticsearch.common.bytes.BytesReference;
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.client.security;
|
||||||
|
|
||||||
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
import org.elasticsearch.test.EqualsHashCodeTestUtils;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
|
public class DeleteUserRequestTests extends ESTestCase {
|
||||||
|
|
||||||
|
public void testDeleteUserRequest() {
|
||||||
|
final String name = randomAlphaOfLength(10);
|
||||||
|
final RefreshPolicy refreshPolicy = randomFrom(RefreshPolicy.values());
|
||||||
|
final DeleteUserRequest deleteUserRequest = new DeleteUserRequest(name, refreshPolicy);
|
||||||
|
assertThat(deleteUserRequest.getName(), equalTo(name));
|
||||||
|
assertThat(deleteUserRequest.getRefreshPolicy(), equalTo(refreshPolicy));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeleteUserRequestThrowsExceptionForNullName() {
|
||||||
|
final NullPointerException ile =
|
||||||
|
expectThrows(NullPointerException.class, () -> new DeleteUserRequest(null, randomFrom(RefreshPolicy.values())));
|
||||||
|
assertThat(ile.getMessage(), equalTo("user name is required"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeleteUserRequestThrowsExceptionForNullRefreshPolicy() {
|
||||||
|
final NullPointerException ile =
|
||||||
|
expectThrows(NullPointerException.class, () -> new DeleteUserRequest(randomAlphaOfLength(10), null));
|
||||||
|
assertThat(ile.getMessage(), equalTo("refresh policy is required"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEqualsHashCode() {
|
||||||
|
final String name = randomAlphaOfLength(10);
|
||||||
|
final RefreshPolicy refreshPolicy = randomFrom(RefreshPolicy.values());
|
||||||
|
final DeleteUserRequest deleteUserRequest = new DeleteUserRequest(name, refreshPolicy);
|
||||||
|
assertNotNull(deleteUserRequest);
|
||||||
|
|
||||||
|
EqualsHashCodeTestUtils.checkEqualsAndHashCode(deleteUserRequest, (original) -> {
|
||||||
|
return new DeleteUserRequest(original.getName(), original.getRefreshPolicy());
|
||||||
|
});
|
||||||
|
|
||||||
|
EqualsHashCodeTestUtils.checkEqualsAndHashCode(deleteUserRequest, (original) -> {
|
||||||
|
return new DeleteUserRequest(original.getName(), original.getRefreshPolicy());
|
||||||
|
}, DeleteUserRequestTests::mutateTestItem);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DeleteUserRequest mutateTestItem(DeleteUserRequest original) {
|
||||||
|
if (randomBoolean()) {
|
||||||
|
return new DeleteUserRequest(randomAlphaOfLength(10), original.getRefreshPolicy());
|
||||||
|
} else {
|
||||||
|
List<RefreshPolicy> values = Arrays.stream(RefreshPolicy.values()).filter(rp -> rp != original.getRefreshPolicy()).collect(
|
||||||
|
Collectors.toList());
|
||||||
|
return new DeleteUserRequest(original.getName(), randomFrom(values));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.client.security;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
|
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class DeleteUserResponseTests extends ESTestCase {
|
||||||
|
|
||||||
|
public void testParsingWithMissingField() throws IOException {
|
||||||
|
XContentType contentType = randomFrom(XContentType.values());
|
||||||
|
XContentBuilder builder = XContentFactory.contentBuilder(contentType).startObject().endObject();
|
||||||
|
BytesReference bytes = BytesReference.bytes(builder);
|
||||||
|
XContentParser parser = XContentFactory.xContent(contentType)
|
||||||
|
.createParser(NamedXContentRegistry.EMPTY, null, bytes.streamInput());
|
||||||
|
parser.nextToken();
|
||||||
|
expectThrows(IllegalArgumentException.class, () -> DeleteUserResponse.fromXContent(parser));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
--
|
||||||
|
:api: delete-user
|
||||||
|
:request: DeleteUserRequest
|
||||||
|
:response: DeleteUserResponse
|
||||||
|
--
|
||||||
|
|
||||||
|
[id="{upid}-{api}"]
|
||||||
|
=== Delete User API
|
||||||
|
|
||||||
|
[id="{upid}-{api}-request"]
|
||||||
|
==== Delete User Request
|
||||||
|
|
||||||
|
A user can be deleted as follows:
|
||||||
|
|
||||||
|
["source","java",subs="attributes,callouts,macros"]
|
||||||
|
--------------------------------------------------
|
||||||
|
include-tagged::{doc-tests-file}[{api}-request]
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
[id="{upid}-{api}-response"]
|
||||||
|
==== Delete Response
|
||||||
|
|
||||||
|
The returned +{response}+ allows to retrieve information about the executed
|
||||||
|
operation as follows:
|
||||||
|
|
||||||
|
["source","java",subs="attributes,callouts,macros"]
|
||||||
|
--------------------------------------------------
|
||||||
|
include-tagged::{doc-tests-file}[{api}-response]
|
||||||
|
--------------------------------------------------
|
||||||
|
<1> whether the given user was found
|
||||||
|
|
||||||
|
include::../execution.asciidoc[]
|
|
@ -373,6 +373,7 @@ include::rollup/get_rollup_index_caps.asciidoc[]
|
||||||
The Java High Level REST Client supports the following Security APIs:
|
The Java High Level REST Client supports the following Security APIs:
|
||||||
|
|
||||||
* <<java-rest-high-security-put-user>>
|
* <<java-rest-high-security-put-user>>
|
||||||
|
* <<{upid}-delete-user>>
|
||||||
* <<java-rest-high-security-enable-user>>
|
* <<java-rest-high-security-enable-user>>
|
||||||
* <<java-rest-high-security-disable-user>>
|
* <<java-rest-high-security-disable-user>>
|
||||||
* <<java-rest-high-security-change-password>>
|
* <<java-rest-high-security-change-password>>
|
||||||
|
@ -392,6 +393,7 @@ The Java High Level REST Client supports the following Security APIs:
|
||||||
* <<{upid}-delete-privileges>>
|
* <<{upid}-delete-privileges>>
|
||||||
|
|
||||||
include::security/put-user.asciidoc[]
|
include::security/put-user.asciidoc[]
|
||||||
|
include::security/delete-user.asciidoc[]
|
||||||
include::security/enable-user.asciidoc[]
|
include::security/enable-user.asciidoc[]
|
||||||
include::security/disable-user.asciidoc[]
|
include::security/disable-user.asciidoc[]
|
||||||
include::security/change-password.asciidoc[]
|
include::security/change-password.asciidoc[]
|
||||||
|
|
Loading…
Reference in New Issue