Fixed SYNCOPE-728, added debug setup option. SYNCOPE-158
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/3cf1df3f Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/3cf1df3f Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/3cf1df3f Branch: refs/heads/master Commit: 3cf1df3f94dda26e259cd89dc900800c6484afa4 Parents: bd910fb Author: massi <massimiliano.perr...@tirasa.net> Authored: Tue Nov 17 17:01:51 2015 +0100 Committer: massi <massimiliano.perr...@tirasa.net> Committed: Tue Nov 17 17:02:10 2015 +0100 ---------------------------------------------------------------------- .../apache/syncope/client/cli/SyncopeAdm.java | 4 +- .../syncope/client/cli/SyncopeServices.java | 13 +++ .../cli/commands/install/InstallCommand.java | 17 +++- .../commands/install/InstallSetupForDebug.java | 80 +++++++++++++++++ .../cli/commands/user/AbstractUserCommand.java | 7 ++ .../client/cli/commands/user/UserCommand.java | 10 ++- .../client/cli/commands/user/UserDeleteAll.java | 94 ++++++++++++++++++++ .../commands/user/UserDeleteByAttribute.java | 84 +++++++++++++++++ .../client/cli/commands/user/UserList.java | 2 +- .../cli/commands/user/UserResultManager.java | 23 ++--- .../commands/user/UserSearchByAttribute.java | 7 +- .../cli/commands/user/UserSearchByResource.java | 6 +- .../cli/commands/user/UserSearchByRole.java | 4 +- .../commands/user/UserSyncopeOperations.java | 47 +++++++++- .../cli/src/main/resources/messages.properties | 2 +- 15 files changed, 367 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java index 5c7ef20..17abce8 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java @@ -52,9 +52,11 @@ public final class SyncopeAdm { System.out.println(helpMessage()); } catch (final IllegalArgumentException ex) { LOG.error("Error in main", ex); - RESULT_MANAGER.genericError(ex.getMessage()); if (!ex.getMessage().startsWith("It seems you")) { + System.out.println(""); System.out.println(helpMessage()); + } else { + RESULT_MANAGER.genericError(ex.getMessage()); } } catch (final ProcessingException e) { LOG.error("Error in main", e); http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeServices.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeServices.java b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeServices.java index 5cfcefa..c3e7062 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeServices.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeServices.java @@ -25,6 +25,7 @@ import org.apache.syncope.client.cli.commands.install.InstallConfigFileTemplate; import org.apache.syncope.client.cli.util.JasyptUtils; import org.apache.syncope.client.lib.SyncopeClient; import org.apache.syncope.client.lib.SyncopeClientFactoryBean; +import org.apache.syncope.common.rest.api.service.SyncopeService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,6 +58,18 @@ public final class SyncopeServices { return SYNCOPE_ADDRESS; } + public static void testUsernameAndPassword(final String username, final String password) { + final Properties properties = new Properties(); + try { + properties.load(new FileInputStream(InstallConfigFileTemplate.configurationFilePath())); + } catch (final IOException e) { + LOG.error("Error opening properties file", e); + } + final SyncopeClient syncopeClient = new SyncopeClientFactoryBean() + .setAddress(properties.getProperty("syncope.rest.services")).create(username, password); + syncopeClient.getService(SyncopeService.class).info(); + } + private SyncopeServices() { // private constructor for static utility class } http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallCommand.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallCommand.java index b71eddd..21a5b40 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallCommand.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallCommand.java @@ -36,7 +36,8 @@ public class InstallCommand extends AbstractCommand { private static final String HELP_MESSAGE = "\nUsage: install [options]\n" + " Options:\n" + " --help \n" - + " --setup\n"; + + " --setup\n" + + " --setup-debug\n"; @Override public void execute(final Input input) { @@ -45,7 +46,7 @@ public class InstallCommand extends AbstractCommand { } switch (Options.fromName(input.getOption())) { - case INSTALL: + case SETUP: try { new InstallSetup().setup(); } catch (final FileNotFoundException | IllegalAccessException ex) { @@ -54,6 +55,15 @@ public class InstallCommand extends AbstractCommand { break; } break; + case SETUP_DEBUG: + try { + new InstallSetupForDebug().setup(); + } catch (final FileNotFoundException | IllegalAccessException ex) { + LOG.error("Error installing CLI", ex); + installResultManager.genericError(ex.getMessage()); + break; + } + break; case HELP: System.out.println(HELP_MESSAGE); break; @@ -70,7 +80,8 @@ public class InstallCommand extends AbstractCommand { private enum Options { HELP("--help"), - INSTALL("--setup"); + SETUP("--setup"), + SETUP_DEBUG("--setup-debug"); private final String optionName; http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallSetupForDebug.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallSetupForDebug.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallSetupForDebug.java new file mode 100644 index 0000000..cb35032 --- /dev/null +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/install/InstallSetupForDebug.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.syncope.client.cli.commands.install; + +import java.io.FileNotFoundException; +import java.io.IOException; +import javax.ws.rs.ProcessingException; +import org.apache.syncope.client.cli.SyncopeServices; +import org.apache.syncope.client.cli.util.FileSystemUtils; +import org.apache.syncope.client.cli.util.JasyptUtils; +import org.apache.syncope.common.rest.api.service.SyncopeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InstallSetupForDebug { + + private static final Logger LOG = LoggerFactory.getLogger(InstallSetupForDebug.class); + + private final InstallResultManager installResultManager = new InstallResultManager(); + + public void setup() throws FileNotFoundException, IllegalAccessException { + installResultManager.printWelcome(); + + System.out.println("Path to config files of Syncope CLI client will be: " + + InstallConfigFileTemplate.dirPath()); + + if (!FileSystemUtils.exists(InstallConfigFileTemplate.dirPath())) { + throw new FileNotFoundException("Directory: " + InstallConfigFileTemplate.dirPath() + " does not exists!"); + } + + if (!FileSystemUtils.canWrite(InstallConfigFileTemplate.dirPath())) { + throw new IllegalAccessException("Permission denied on " + InstallConfigFileTemplate.dirPath()); + } + System.out.println("- File system permission checked"); + System.out.println(""); + + final JasyptUtils jasyptUtils = JasyptUtils.getJasyptUtils(); + try { + + final String contentCliPropertiesFile = InstallConfigFileTemplate.cliPropertiesFile( + "http", + "localhost", + "9080", + "/syncope/rest", + "admin", + jasyptUtils.encrypt("password")); + FileSystemUtils.createFileWith(InstallConfigFileTemplate.configurationFilePath(), contentCliPropertiesFile); + } catch (final IOException ex) { + System.out.println(ex.getMessage()); + } + + try { + final SyncopeService syncopeService = SyncopeServices.get(SyncopeService.class); + final String syncopeVersion = syncopeService.info().getVersion(); + installResultManager.installationSuccessful(syncopeVersion); + } catch (final ProcessingException ex) { + LOG.error("Error installing CLI", ex); + installResultManager.manageProcessingException(ex); + } catch (final Exception e) { + LOG.error("Error installing CLI", e); + installResultManager.manageException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/AbstractUserCommand.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/AbstractUserCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/AbstractUserCommand.java index 5a28a04..eb53ab1 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/AbstractUserCommand.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/AbstractUserCommand.java @@ -18,8 +18,15 @@ */ package org.apache.syncope.client.cli.commands.user; +import org.apache.syncope.client.cli.commands.realm.RealmSyncopeOperations; +import org.apache.syncope.client.cli.commands.resource.ResourceSyncopeOperations; + public abstract class AbstractUserCommand { + protected final RealmSyncopeOperations realmSyncopeOperations = new RealmSyncopeOperations(); + + protected final ResourceSyncopeOperations resourceSyncopeOperations = new ResourceSyncopeOperations(); + protected final UserSyncopeOperations userSyncopeOperations = new UserSyncopeOperations(); protected final UserResultManager userResultManager = new UserResultManager(); http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserCommand.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserCommand.java index 7339f25..3832625 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserCommand.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserCommand.java @@ -64,6 +64,12 @@ public class UserCommand extends AbstractCommand { case DELETE: new UserDelete(input).delete(); break; + case DELETE_ALL: + new UserDeleteAll(input).delete(); + break; + case DELETE_BY_ATTRIBUTE: + new UserDeleteByAttribute(input).delete(); + break; case HELP: System.out.println(getHelpMessage()); break; @@ -88,7 +94,9 @@ public class UserCommand extends AbstractCommand { SEARCH_BY_ATTRIBUTE("--search-by-attribute"), SEARCH_BY_ROLE("--search-by-role"), SEARCH_BY_RESOURCE("--search-by-resource"), - DELETE("--delete"); + DELETE("--delete"), + DELETE_ALL("--delete-all"), + DELETE_BY_ATTRIBUTE("--delete-by-attribute"); private final String optionName; http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteAll.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteAll.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteAll.java new file mode 100644 index 0000000..2bde176 --- /dev/null +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteAll.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.syncope.client.cli.commands.user; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +import org.apache.syncope.client.cli.Input; +import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.to.BulkActionResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UserDeleteAll extends AbstractUserCommand { + + private static final Logger LOG = LoggerFactory.getLogger(UserDeleteAll.class); + + private static final String DELETE_ALL_HELP_MESSAGE = "user --delete-all {REALM}"; + + private final Input input; + + public UserDeleteAll(final Input input) { + this.input = input; + } + + public void delete() { + if (input.parameterNumber() == 1) { + try { + final Scanner scanIn = new Scanner(System.in); + System.out.println( + "\nRunning this operation you will delete all the realm users managed by Syncope, " + + "are you sure? [yes/no]"); + final String answer = scanIn.nextLine(); + if ("yes".equalsIgnoreCase(answer)) { + System.out.println("\nUsername:"); + final String username = scanIn.nextLine(); + System.out.println("\nPassword:"); + final String password = scanIn.nextLine(); + if (userSyncopeOperations.auth(username, password)) { + System.out.println("Deleting process started"); + final String realm = input.firstParameter(); + if (!realmSyncopeOperations.exists(realm)) { + userResultManager.notFoundError("Realm", realm); + return; + } + final Map<String, BulkActionResult.Status> results = userSyncopeOperations.deleteAll(realm); + final Map<String, String> users = new HashMap<>(); + int deletedUsers = 0; + for (final Map.Entry<String, BulkActionResult.Status> entrySet : results.entrySet()) { + final String userId = entrySet.getKey(); + final BulkActionResult.Status status = entrySet.getValue(); + if (!BulkActionResult.Status.SUCCESS.equals(status)) { + users.put(userId, status.name()); + } else { + deletedUsers++; + } + } + userResultManager.genericMessage("Deleted users: " + deletedUsers); + if (!users.isEmpty()) { + userResultManager.printUndeletedUsers(users); + } + } else { + userResultManager.genericError("Authentication error"); + } + } else if ("no".equalsIgnoreCase(answer)) { + userResultManager.genericError("Delete all operation skipped"); + } else { + userResultManager.genericError("Invalid parameter, please use [yes/no]"); + } + } catch (final SyncopeClientException ex) { + LOG.error("Error deleting user", ex); + userResultManager.genericError(ex.getMessage()); + } + } else { + userResultManager.commandOptionError(DELETE_ALL_HELP_MESSAGE); + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteByAttribute.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteByAttribute.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteByAttribute.java new file mode 100644 index 0000000..b559672 --- /dev/null +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDeleteByAttribute.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.syncope.client.cli.commands.user; + +import java.util.HashMap; +import java.util.Map; +import javax.xml.ws.WebServiceException; +import org.apache.syncope.client.cli.Input; +import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.to.BulkActionResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UserDeleteByAttribute extends AbstractUserCommand { + + private static final Logger LOG = LoggerFactory.getLogger(UserDeleteByAttribute.class); + + private static final String SEARCH_HELP_MESSAGE = "user --delete-by-attribute {REALM} {ATTR-NAME}={ATTR-VALUE}"; + + private final Input input; + + public UserDeleteByAttribute(final Input input) { + this.input = input; + } + + public void delete() { + if (input.parameterNumber() == 2) { + final String realm = input.firstParameter(); + final Input.PairParameter pairParameter = input.toPairParameter(input.secondParameter()); + try { + if (!realmSyncopeOperations.exists(realm)) { + userResultManager.notFoundError("Realm", realm); + return; + } + final Map<String, BulkActionResult.Status> results = userSyncopeOperations.deleteByAttribute( + realm, pairParameter.getKey(), pairParameter.getValue()); + final Map<String, String> users = new HashMap<>(); + int deletedUsers = 0; + for (final Map.Entry<String, BulkActionResult.Status> entrySet : results.entrySet()) { + final String userId = entrySet.getKey(); + final BulkActionResult.Status status = entrySet.getValue(); + if (!BulkActionResult.Status.SUCCESS.equals(status)) { + users.put(userId, status.name()); + } else { + deletedUsers++; + } + } + userResultManager.genericMessage("Deleted users: " + deletedUsers); + if (!users.isEmpty()) { + userResultManager.printUndeletedUsers(users); + } + } catch (final WebServiceException | SyncopeClientException ex) { + LOG.error("Error searching user", ex); + if (ex.getMessage().startsWith("NotFound")) { + userResultManager.notFoundError("User with " + pairParameter.getKey(), pairParameter.getValue()); + } else { + userResultManager.genericError(ex.getMessage()); + } + } catch (final IllegalArgumentException ex) { + LOG.error("Error searching user", ex); + userResultManager.genericError(ex.getMessage()); + userResultManager.genericError(SEARCH_HELP_MESSAGE); + } + } else { + userResultManager.commandOptionError(SEARCH_HELP_MESSAGE); + } + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java index e498747..42b5a23 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserList.java @@ -44,7 +44,7 @@ public class UserList extends AbstractUserCommand { try { final Scanner scanIn = new Scanner(System.in); System.out.println( - "This operation could be print a lot of information " + "\nThis operation could be print a lot of information " + "on your screen. Do you want to continue? [yes/no]"); final String answer = scanIn.nextLine(); if ("yes".equalsIgnoreCase(answer)) { http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java index 3efc68b..ccc41df 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java @@ -18,12 +18,14 @@ */ package org.apache.syncope.client.cli.commands.user; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.syncope.client.cli.commands.CommonsResultManager; +import org.apache.syncope.client.cli.view.Table; import org.apache.syncope.common.lib.to.AttrTO; -import org.apache.syncope.common.lib.to.PropagationStatus; import org.apache.syncope.common.lib.to.RelationshipTO; import org.apache.syncope.common.lib.to.UserTO; @@ -92,20 +94,21 @@ public class UserResultManager extends CommonsResultManager { System.out.println(attributeSentence); } } - - private void printPropagationStatus(final List<PropagationStatus> propagationStatuses) { - for (final PropagationStatus propagationStatus : propagationStatuses) { - System.out.println(" status: " + propagationStatus.getStatus()); - System.out.println(" resource: " + propagationStatus.getResource()); - System.out.println(" failure reason: " + propagationStatus.getFailureReason()); - } - } - + private void printRelationships(final List<RelationshipTO> relationshipTOs) { for (final RelationshipTO relationshipTO : relationshipTOs) { System.out.println(" type: " + relationshipTO.getType()); } } + + public void printUndeletedUsers(final Map<String, String> users) { + final Table.TableBuilder tableBuilder + = new Table.TableBuilder("Users not deleted").header("user id").header("cause"); + for (final Map.Entry<String, String> entrySet : users.entrySet()) { + tableBuilder.rowValues(new LinkedList(Arrays.asList(entrySet.getKey(), entrySet.getValue()))); + } + tableBuilder.build().print(); + } public void printDetails(final Map<String, String> details) { printDetails("users details", details); http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByAttribute.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByAttribute.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByAttribute.java index 874c6a4..95ad127 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByAttribute.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByAttribute.java @@ -21,7 +21,6 @@ package org.apache.syncope.client.cli.commands.user; import java.util.List; import javax.xml.ws.WebServiceException; import org.apache.syncope.client.cli.Input; -import org.apache.syncope.client.cli.commands.realm.RealmSyncopeOperations; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.UserTO; import org.slf4j.Logger; @@ -40,15 +39,14 @@ public class UserSearchByAttribute extends AbstractUserCommand { } public void search() { - if (input.parameterNumber() >= 2) { + if (input.parameterNumber() == 2) { final String realm = input.firstParameter(); final Input.PairParameter pairParameter = input.toPairParameter(input.secondParameter()); - final RealmSyncopeOperations realmSyncopeOperations = new RealmSyncopeOperations(); try { List<UserTO> userTOs; if (!realmSyncopeOperations.exists(realm)) { userResultManager.genericMessage("Operation performed on root realm because " + realm - + "does not exists"); + + " does not exists"); } userTOs = userSyncopeOperations.searchByAttribute( realm, pairParameter.getKey(), pairParameter.getValue()); @@ -70,6 +68,7 @@ public class UserSearchByAttribute extends AbstractUserCommand { userResultManager.genericError(ex.getMessage()); userResultManager.genericError(SEARCH_HELP_MESSAGE); } + } else { userResultManager.commandOptionError(SEARCH_HELP_MESSAGE); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByResource.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByResource.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByResource.java index 0fb7b9f..f258bfd 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByResource.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByResource.java @@ -21,8 +21,6 @@ package org.apache.syncope.client.cli.commands.user; import java.util.List; import javax.xml.ws.WebServiceException; import org.apache.syncope.client.cli.Input; -import org.apache.syncope.client.cli.commands.realm.RealmSyncopeOperations; -import org.apache.syncope.client.cli.commands.resource.ResourceSyncopeOperations; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.UserTO; import org.slf4j.Logger; @@ -44,13 +42,11 @@ public class UserSearchByResource extends AbstractUserCommand { if (input.parameterNumber() == 2) { final String realm = input.firstParameter(); final String resource = input.secondParameter(); - final RealmSyncopeOperations realmSyncopeOperations = new RealmSyncopeOperations(); - final ResourceSyncopeOperations resourceSyncopeOperations = new ResourceSyncopeOperations(); try { List<UserTO> userTOs = null; if (!realmSyncopeOperations.exists(realm)) { userResultManager.genericMessage("Operation performed on root realm because " + realm - + "does not exists"); + + " does not exists"); } if (!resourceSyncopeOperations.exists(resource)) { userResultManager.notFoundError("Resource", resource); http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByRole.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByRole.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByRole.java index 861c9e9..6a0a523 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByRole.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSearchByRole.java @@ -21,7 +21,6 @@ package org.apache.syncope.client.cli.commands.user; import java.util.List; import javax.xml.ws.WebServiceException; import org.apache.syncope.client.cli.Input; -import org.apache.syncope.client.cli.commands.realm.RealmSyncopeOperations; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.UserTO; import org.slf4j.Logger; @@ -43,12 +42,11 @@ public class UserSearchByRole extends AbstractUserCommand { if (input.parameterNumber() == 2) { final String realm = input.firstParameter(); final String role = input.secondParameter(); - final RealmSyncopeOperations realmSyncopeOperations = new RealmSyncopeOperations(); try { List<UserTO> userTOs; if (!realmSyncopeOperations.exists(realm)) { userResultManager.genericMessage("Operation performed on root realm because " - + realm + "does not exists"); + + realm + " does not exists"); } userTOs = userSyncopeOperations.searchByRole(realm, input.secondParameter()); if (userTOs == null || userTOs.isEmpty()) { http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java ---------------------------------------------------------------------- diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java index 8df901f..aec9271 100644 --- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java +++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserSyncopeOperations.java @@ -18,9 +18,13 @@ */ package org.apache.syncope.client.cli.commands.user; +import java.util.Arrays; import java.util.List; +import java.util.Map; import org.apache.syncope.client.cli.SyncopeServices; import org.apache.syncope.client.lib.SyncopeClient; +import org.apache.syncope.common.lib.to.BulkAction; +import org.apache.syncope.common.lib.to.BulkActionResult; import org.apache.syncope.common.lib.to.PagedResult; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.common.rest.api.RESTHeaders; @@ -31,6 +35,15 @@ public class UserSyncopeOperations { private final UserService userService = SyncopeServices.get(UserService.class); + public boolean auth(final String username, final String password) { + try { + SyncopeServices.testUsernameAndPassword(username, password); + return true; + } catch (final Exception e) { + return false; + } + } + public List<UserTO> searchByRole(final String realm, final String role) { return userService.search( SyncopeClient.getAnySearchQueryBuilder().realm(realm). @@ -60,10 +73,6 @@ public class UserSyncopeOperations { return userService.read(Long.valueOf(userId)); } - public void delete(final String userId) { - userService.delete(Long.valueOf(userId)); - } - public String getUsernameFromId(final String userId) { return userService.getUsername(Long.valueOf(userId)).getHeaderString(RESTHeaders.USERNAME); } @@ -71,4 +80,34 @@ public class UserSyncopeOperations { public String getIdFromUsername(final String username) { return userService.getUserKey(username).getHeaderString(RESTHeaders.USER_KEY); } + + public void delete(final String userId) { + userService.delete(Long.valueOf(userId)); + } + + public Map<String, BulkActionResult.Status> deleteByAttribute( + final String realm, final String attributeName, final String attributeValue) { + final List<UserTO> users = userService.search( + SyncopeClient.getAnySearchQueryBuilder().realm(realm). + fiql(SyncopeClient.getUserSearchConditionBuilder().is(attributeName).equalTo(attributeValue) + .query()).build()).getResult(); + return deleteBulk(users); + } + + public Map<String, BulkActionResult.Status> deleteAll(final String realm) { + final AnyListQuery anyListQuery = new AnyListQuery(); + anyListQuery.setDetails(false); + anyListQuery.setRealms(Arrays.asList(realm)); + return deleteBulk(userService.list(anyListQuery).getResult()); + } + + private Map<String, BulkActionResult.Status> deleteBulk(final List<UserTO> users) { + final BulkAction bulkAction = new BulkAction(); + bulkAction.setType(BulkAction.Type.DELETE); + for (UserTO user : users) { + bulkAction.getTargets().add(String.valueOf(user.getKey())); + } + final BulkActionResult bulkResult = userService.bulk(bulkAction); + return bulkResult.getResults(); + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/3cf1df3f/client/cli/src/main/resources/messages.properties ---------------------------------------------------------------------- diff --git a/client/cli/src/main/resources/messages.properties b/client/cli/src/main/resources/messages.properties index 6e6cf72..0e0700d 100644 --- a/client/cli/src/main/resources/messages.properties +++ b/client/cli/src/main/resources/messages.properties @@ -30,5 +30,5 @@ resource.help.message=\nUsage: resource [options]\n Options:\n --help \n role.help.message=\nUsage: role [options]\n Options:\n --help \n --details \n --list \n --read \n Syntax: --read {ROLE-ID} {ROLE-ID} [...]\n --delete \n Syntax: --delete {ROLE-ID} {ROLE-ID} [...]\n schema.help.message=\nUsage: schema [options]\n Options:\n --help \n --details \n --list-all\n --list-plain\n --list-derived\n --list-virtual\n --read {SCHEMA-TYPE} {SCHEMA-KEY}\n Schema type: PLAIN / DERIVED / VIRTUAL\n --delete {SCHEMA-TYPE} {SCHEMA-KEY}\n Schema type: PLAIN / DERIVED / VIRTUAL\n task.help.message=\nUsage: task [options]\n Options:\n --help \n --details\n --list\n Syntax: --list {TASK-TYPE} \n Task type: NOTIFICATION / PROPAGATION / PUSH / SCHEDULED / SYNCHRONIZATION\n --list-running-jobs \n --list-scheduled-jobs \n --read \n Syntax: --read {TASK-ID} {TASK-ID} [...]\n --read-execution \n Syntax: --read-execution {TASK-EXEC-ID} {TASK-EXEC-ID} [...]\n --delete \n Syntax: --delete {TASK-ID} {TASK-ID} [...]\n --delete-execution \n Syntax: --delete-execution {TASK-EXEC-ID} {TASK-EXEC-ID} [...]\n --execute \n Syntax: --execute {TASK-ID} {DRY-RUN}\n Dry run: true / false\n -user.help.message=\nUsage: user [options]\n Options:\n --help \n --list \n --details \n --get-user-key\n Syntax: --get-user-key {USERNAME} {USERNAME} [...]\n --get-username\n Syntax: --get-username {USER-ID} {USER-ID} [...]\n --read \n Syntax: --read {USER-ID} {USER-ID} [...]\n --search-by-attribute \n Syntax: --search-by-attribute {REALM} {ATTR-NAME}={ATTR-VALUE}\n --search-by-role \n Syntax: --search-by-role {REALM} {ROLE-ID}\n --search-by-resource \n Syntax: --search-by-resource {REALM} {RESOURCE-NAME}\n --delete-all\n --delete \n Syntax: --delete {USER-ID} {USER-ID} [...]\n +user.help.message=\nUsage: user [options]\n Options:\n --help \n --list \n --details \n --get-user-key\n Syntax: --get-user-key {USERNAME} {USERNAME} [...]\n --get-username\n Syntax: --get-username {USER-ID} {USER-ID} [...]\n --read \n Syntax: --read {USER-ID} {USER-ID} [...]\n --search-by-attribute \n Syntax: --search-by-attribute {REALM} {ATTR-NAME}={ATTR-VALUE}\n --search-by-role \n Syntax: --search-by-role {REALM} {ROLE-ID}\n --search-by-resource \n Syntax: --search-by-resource {REALM} {RESOURCE-NAME}\n --delete \n Syntax: --delete {USER-ID} {USER-ID} [...]\n --delete-all \n Syntax: --delete-all {REALM}\n --delete-by-attribute \n Syntax: --delete-by-attribute {REALM} {ATTR-NAME}={ATTR-VALUE}\n workflow.help.message=\nUsage: workflow [options]\n Options:\n --help \n --export-diagram {ANY-TYPE-KIND}\n Any type kind: ANY_OBJECT / USER / GROUP\n --export-definition {ANY-TYPE-KIND}\n Any type kind: ANY_OBJECT / USER / GROUP\n