/*
* A CCNx command line utility.
*
* Copyright (C) 2010, 2012 Palo Alto Research Center, Inc.
*
* This work is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
* This work is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details. You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
package org.ccnx.ccn.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.SortedSet;
import java.util.logging.Level;
import org.ccnx.ccn.CCNHandle;
import org.ccnx.ccn.config.SystemConfiguration;
import org.ccnx.ccn.config.UserConfiguration;
import org.ccnx.ccn.impl.support.Log;
import org.ccnx.ccn.io.content.Link;
import org.ccnx.ccn.profiles.nameenum.EnumeratedNameList;
import org.ccnx.ccn.profiles.security.access.AccessDeniedException;
import org.ccnx.ccn.profiles.security.access.group.Group;
import org.ccnx.ccn.profiles.security.access.group.GroupAccessControlManager;
import org.ccnx.ccn.profiles.security.access.group.GroupManager;
import org.ccnx.ccn.profiles.security.access.group.MembershipListObject;
import org.ccnx.ccn.protocol.ContentName;
public class ccngroup {
private static long TIMEOUT = 1000;
private static ContentName userStorage = new ContentName(UserConfiguration.defaultNamespace(), "Users");
private static ContentName groupStorage = new ContentName(UserConfiguration.defaultNamespace(), "Groups");
/**
* @param args
*/
public static void main(String[] args) {
// silence logging
Log.setDefaultLevel(Level.WARNING);
String extraUsage = "";
if ((args == null) || (args.length == 0)) {
usage(extraUsage);
}
int pos = 0;
if (args[0].startsWith("[")) {
extraUsage = args[0];
pos++;
}
if (args[pos].equals("-h")) {
usage(extraUsage);
}
if (args[pos].equals("-as")) {
if (args.length < pos+2) usage(extraUsage);
pos++;
setUser(args[pos]);
pos++;
}
if (args[pos].equals("-list")) {
listGroups();
System.exit(0);
}
else if (args[pos].equals("-listmembers")) {
if (args.length < pos + 2) usage(extraUsage);
pos++;
String groupName = args[pos];
listMembers(groupName);
System.exit(0);
}
else if (args[pos].equals("-delete")) {
if (args.length < pos + 2) usage(extraUsage);
pos ++;
String groupName = args[pos];
deleteGroup(groupName);
System.exit(0);
}
else if (args[pos].equals("-create") || args[pos].equals("-add") || args[pos].equals("-remove")) {
if (args.length < pos + 2) usage(extraUsage);
String command = args[pos];
pos++;
String groupName = args[pos];
pos++;
ArrayList<Link> groupMembers = new ArrayList<Link>();
for (int i=pos; i<args.length; i++) {
try {
Link lk = new Link(ContentName.fromNative(args[i]));
groupMembers.add(lk);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
if (command.equals("-create")) createGroup(groupName, groupMembers);
else if (command.equals("-add")) addMember(groupName, groupMembers);
else if (command.equals("-remove")) removeMember(groupName, groupMembers);
System.exit(0);
}
else {
usage(extraUsage);
}
}
public static void usage(String extraUsage) {
System.out.println("usage:");
System.out.println("ccngroup " + extraUsage + "[-as pathToKeystore] -list");
System.out.println("ccngroup " + extraUsage + "[-as pathToKeystore] -listmembers groupFriendlyName");
System.out.println("ccngroup " + extraUsage + "[-as pathToKeystore] [-create | -add | -remove] groupFriendlyName (groupMember)*");
System.out.println("ccngroup " + extraUsage + "[-as pathToKeystore] -delete groupFriendlyName");
System.exit(1);
}
public static void setUser(String pathToKeystore) {
File userDirectory = new File(pathToKeystore);
String userConfigDir = userDirectory.getAbsolutePath();
System.out.println("Loading keystore from: " + userConfigDir);
UserConfiguration.setUserConfigurationDirectory(userConfigDir);
// Assume here that the name of the file is the userName
String userName = userDirectory.getName();
if (userName != null) {
System.out.println("User: " + userName);
UserConfiguration.setUserName(userName);
}
}
public static void listGroups() {
try {
EnumeratedNameList userDirectory = new EnumeratedNameList(groupStorage, CCNHandle.open());
userDirectory.waitForChildren(TIMEOUT);
Thread.sleep(TIMEOUT);
SortedSet<ContentName> availableChildren = userDirectory.getChildren();
if ((null == availableChildren) || (availableChildren.size() == 0)) {
System.out.println("No group found in: " + groupStorage);
}
else {
System.out.println(availableChildren.size() + " group(s) found in: " + groupStorage);
for (ContentName child : availableChildren) {
ContentName fullName = groupStorage.append(child);
System.out.println(fullName);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void listMembers(String groupName) {
try{
GroupAccessControlManager acm = new GroupAccessControlManager(null, groupStorage, userStorage, CCNHandle.open());
GroupManager gm = acm.groupManager();
Thread.sleep(TIMEOUT);
Group g = gm.getGroup(groupName, SystemConfiguration.getDefaultTimeout());
MembershipListObject ml = g.membershipList();
LinkedList<Link> lll = ml.contents();
System.out.println("The group " + groupName + " has " + lll.size() + " members:");
for (Link l: lll) {
System.out.println(l.targetName());
}
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
public static void createGroup(String groupName, ArrayList<Link> membersToAdd) {
try {
ContentName root = ContentName.fromNative("/");
GroupAccessControlManager acm = new GroupAccessControlManager(root, groupStorage, userStorage, CCNHandle.open());
GroupManager gm = acm.groupManager();
gm.createGroup(groupName, membersToAdd, SystemConfiguration.getDefaultTimeout());
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.out.println("Group " + groupName + " created, with members: ");
for (Link lk: membersToAdd) {
System.out.println(lk.targetName());
}
}
public static void deleteGroup(String groupName) {
try {
GroupAccessControlManager acm = new GroupAccessControlManager(null, groupStorage, userStorage, CCNHandle.open());
GroupManager gm = acm.groupManager();
gm.deleteGroup(groupName);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.out.println("Deleted group " + groupName);
}
public static void addMember(String groupName, ArrayList<Link> membersToAdd) {
try {
GroupAccessControlManager acm = new GroupAccessControlManager(null, groupStorage, userStorage, CCNHandle.open());
GroupManager gm = acm.groupManager();
Thread.sleep(TIMEOUT);
Group g = gm.getGroup(groupName, SystemConfiguration.getDefaultTimeout());
g.modify(membersToAdd, null);
}
catch (AccessDeniedException aed) {
System.out.println("You do not have the permission to edit the membership of Group " + groupName);
System.exit(1);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.out.println("Added to group " + groupName + " the following members: ");
for (Link lk: membersToAdd) {
System.out.println(lk.targetName());
}
}
public static void removeMember(String groupName, ArrayList<Link> membersToRemove) {
try {
GroupAccessControlManager acm = new GroupAccessControlManager(null, groupStorage, userStorage, CCNHandle.open());
GroupManager gm = acm.groupManager();
Thread.sleep(TIMEOUT);
Group g = gm.getGroup(groupName, SystemConfiguration.getDefaultTimeout());
g.modify(null, membersToRemove);
}
catch (AccessDeniedException aed) {
System.out.println("You do not have the permission to edit the membership of Group " + groupName);
System.exit(1);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.out.println("Removed from group " + groupName + " the following members: ");
for (Link lk: membersToRemove) {
System.out.println(lk.targetName());
}
}
}