diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java new file mode 100644 index 0000000000000000000000000000000000000000..66eaaa4c1094f5392769c3efb4f1e68ecf200f40 --- /dev/null +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java @@ -0,0 +1,53 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package ca.nrc.cadc.ac.server.web.groups; + +import ca.nrc.cadc.ac.Group; +import ca.nrc.cadc.ac.xml.GroupListWriter; +import ca.nrc.cadc.ac.xml.GroupWriter; +import java.security.AccessControlException; +import java.util.ArrayList; +import java.util.Collection; +import org.apache.log4j.Logger; + +/** + * + * @author bertocco + */ +public class GetGroupsListAction extends AbstractGroupAction { + + + private static final Logger log = Logger.getLogger(GetGroupsListAction.class); + + GetGroupsListAction() + { + super(); + } + + public void doAction() throws Exception + { + + Collection<String> groupNames = groupPersistence.getGroupNames(); + Collection<Group> groups = new ArrayList<Group>(); + log.debug("Found " + groupNames.size() + " group names"); + + Group group = new Group(); + syncOut.setHeader("Content-Type", "application/xml"); + GroupListWriter groupListWriter = new GroupListWriter(); + for (final String currentGroup : groupNames) + { + try { + group = groupPersistence.getGroup(currentGroup); + groups.add(group); + } catch (AccessControlException ace) { + // The user can read only groups of which is member or owner + log.info("User can not read group " + currentGroup); + } + } + groupListWriter.write(groups, syncOut.getWriter()); + } + +} diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java index 4c3bef610e7ed80924edd1b1ee4d8f218b53ed7d..241f25bbed44415db4a621335fe1692048141e07 100755 --- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java +++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java @@ -109,12 +109,16 @@ public abstract class GroupsActionFactory { action = new GetGroupNamesAction(); } - else if (segments.length == 1) + else if ((segments.length == 1) && (segments[0].equals("list"))) + { + action = new GetGroupsListAction(); + } + else if ((segments.length == 1) && (!segments[0].equals("list"))) { String groupName = segments[0]; - action = new GetGroupAction(groupName); + action = new GetGroupAction(groupName); } - + if (action != null) { log.debug("Returning action: " + action.getClass()); diff --git a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java index bc5bd3df594630e34b86e93ef04422d8cacb1d17..5b5f03befb637d7df3220b98a235c7bd139fa0e6 100755 --- a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java +++ b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java @@ -165,9 +165,55 @@ public class GMSClient implements TransferListener * * @return The list of groups. */ - public List<Group> getGroups() + public List<Group> getGroups() throws GroupNotFoundException, IOException { - throw new UnsupportedOperationException("Not yet implemented"); + + URL groupsURL = lookupServiceURL(Standards.GMS_GROUPS_01); + URL getGroupListURL = new URL(groupsURL.toExternalForm() + "/list"); + log.debug("getGroup request to " + getGroupListURL.toString()); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + HttpDownload transfer = new HttpDownload(getGroupListURL, out); + transfer.setSSLSocketFactory(getSSLSocketFactory()); + transfer.run(); + + Throwable error = transfer.getThrowable(); + if (error != null) + { + log.debug("getGroup throwable (" + transfer.getResponseCode() + ")", error); + // transfer returns a -1 code for anonymous access. + if ((transfer.getResponseCode() == -1) || + (transfer.getResponseCode() == 401) || + (transfer.getResponseCode() == 403)) + { + throw new AccessControlException(error.getMessage()); + } + if (transfer.getResponseCode() == 400) + { + throw new IllegalArgumentException(error.getMessage()); + } + if (transfer.getResponseCode() == 404) + { + throw new GroupNotFoundException(error.getMessage()); + } + throw new IOException(error); + } + + try + { + String groupsXML = new String(out.toByteArray(), "UTF-8"); + log.debug("getGroups returned: " + groupsXML); + GroupListReader groupListReader = new GroupListReader(); + List<Group> groupsList = groupListReader.read(groupsXML); + + return groupListReader.read(groupsXML); + } + catch (Exception bug) + { + log.error("Unexpected exception", bug); + throw new RuntimeException(bug); + } + } /** diff --git a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java index 87bfca844bb120487f76a02238f741c8fb35abc8..d90fece2612de845e52e91b7a71322fb4a0658e2 100644 --- a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java +++ b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java @@ -112,6 +112,8 @@ public class Main implements PrivilegedAction<Object> public static final String ARG_USERID = "userid"; public static final String ARG_GROUP = "group"; + public static final String ARG_LIST = "list"; + public static final String ARG_HELP = "help"; public static final String ARG_VERBOSE = "verbose"; public static final String ARG_DEBUG = "debug"; @@ -186,6 +188,9 @@ public class Main implements PrivilegedAction<Object> if (argMap.isSet(ARG_DEL_ADMIN)) return ARG_DEL_ADMIN; + if (argMap.isSet(ARG_LIST)) + return ARG_LIST; + throw new IllegalArgumentException("No valid commands"); } @@ -195,6 +200,8 @@ public class Main implements PrivilegedAction<Object> System.out.println("--get --group=<uri>"); System.out.println("--delete --group=<uri>"); System.out.println(); + System.out.println("--list --group=<uri>"); + System.out.println(); System.out.println("--add-member --group=<uri> --userid=<u>"); System.out.println("--remove-member --group=<uri> --userid=<u>"); System.out.println(); @@ -362,6 +369,13 @@ public class Main implements PrivilegedAction<Object> client.deleteGroup(group); } + else if (command.equals(ARG_LIST)) + { + if (group == null) + throw new IllegalArgumentException("No group specified"); + + return client.getGroups(); + } return null; }