package dmg.cells.services.login ;
import java.io.File;
import java.util.Hashtable;
import java.util.Iterator;
import dmg.util.cdb.CdbDirectoryContainer;
import dmg.util.cdb.CdbException;
import dmg.util.cdb.CdbFileRecord;
import dmg.util.cdb.CdbGLock;
import dmg.util.cdb.CdbLockable;
public class UserDb extends CdbGLock {
public static void main( String [] args ) throws Exception {
UserDb _db ;
try{
_db = new UserDb( new File(".") , true ) ;
}catch( Exception e ){
// System.out.println( "Can't create , trying to open" ) ;
_db = new UserDb( new File(".") , false ) ;
}
if( args.length < 2 ){
System.err.println( "USAGE : ... create-user <user>" ) ;
System.err.println( " destroy-user <user>" ) ;
System.err.println( " add-user <group> <user>" ) ;
System.err.println( " create-group <group>" ) ;
System.err.println( " rm-user <group> <user>" ) ;
System.err.println( " show-user <user>" ) ;
System.err.println( " set-password <user> <password>" ) ;
System.err.println( " add-priv p|n <user> <privilege>" ) ;
System.err.println( " rm-priv <user> <privilege>" ) ;
System.err.println( " get-parents <user>" ) ;
System.err.println( " isallowed <user> <privilege>" ) ;
System.exit(4);
}
try{
switch (args[0]) {
case "create-user":
_db.createUser(args[1]);
break;
case "create-group":
_db.createGroup(args[1]);
break;
case "destroy-user":
_db.destroyUser(args[1]);
break;
case "show-user": {
UserHandle user = _db.getUserByName(args[1]);
System.out.println(user);
System.out.println("Global prives : ");
System.out.println(_db.getUserPrivileges(args[1]));
break;
}
case "get-parents":
long start = System.currentTimeMillis();
String[] parents = _db.getAllParents(args[1]);
long diff = System.currentTimeMillis() - start;
for (String parent : parents) {
System.out.println(parent);
}
System.out.println("(Time=" + diff + " millis)");
break;
case "add-user":
if (args.length < 3) {
throw new IllegalArgumentException("add-user <group> <user>");
}
_db.addUser(args[1], args[2]);
break;
case "rm-user":
if (args.length < 3) {
throw new IllegalArgumentException("add-user <group> <user>");
}
_db.addUser(args[1], args[2]);
break;
case "set-password": {
if (args.length < 3) {
throw new IllegalArgumentException("set-password <user> <passwd>");
}
UserHandle user = _db.getUserByName(args[1]);
user.open(CdbLockable.WRITE);
user.setPassword(args[2]);
user.close(CdbLockable.COMMIT);
break;
}
case "isallowed":
if (args.length < 3) {
throw new IllegalArgumentException("isallowed <user> <privileged>");
}
UserPrivileges priv = _db.getUserPrivileges(args[1]);
System.out.println("Result : " + priv.isAllowed(args[2]));
break;
case "add-priv": {
if ((args.length < 4) ||
((!args[1].equals("p")) && (!args[1].equals("n")))) {
throw new IllegalArgumentException("add-priv p|n <user> <privilege>");
}
UserHandle user = _db.getUserByName(args[2]);
user.open(CdbLockable.WRITE);
if (args[1].equals("p")) {
user.addAllowed(args[3]);
} else {
user.addDenied(args[3]);
}
user.close(CdbLockable.COMMIT);
break;
}
case "rm-priv": {
if (args.length < 3) {
throw new IllegalArgumentException("rm-priv <user> <privilege>");
}
UserHandle user = _db.getUserByName(args[1]);
user.open(CdbLockable.WRITE);
user.removeAllowed(args[2]);
user.removeDenied(args[2]);
user.close(CdbLockable.COMMIT);
break;
}
default:
throw new
IllegalArgumentException("Command not known : " + args[0]);
}
}catch(Exception eeee ){
System.out.println( eeee.getMessage() ) ;
}
}
private CdbDirectoryContainer _userContainer;
public UserDb( File file , boolean create ) throws CdbException {
if( ! file.isDirectory() ) {
throw new CdbException("Database doesn't exits : " + file);
}
_userContainer =
new CdbDirectoryContainer(
this ,
CdbFileRecord.class ,
UserHandle.class ,
new File( file , "users" ) ,
create ) ;
}
public void destroyUser( String userName ) throws Exception {
UserHandle user = getUserByName( userName ) ;
boolean isGroup ;
String [] childs ;
user.open( CdbLockable.READ ) ;
isGroup = user.isGroup() ;
childs = user.getChilds() ;
user.close( CdbLockable.COMMIT ) ;
if( isGroup && ( childs.length > 0 ) ) {
throw new
IllegalArgumentException("group not empty : " + userName);
}
user.open( CdbLockable.WRITE ) ;
String [] parents = user.getParents() ;
for (String parent : parents) {
UserHandle x = getUserByName(parent);
x.open(CdbLockable.WRITE);
x.removeChild(userName);
x.close(CdbLockable.COMMIT);
user.removeParent(parent);
}
user.close( CdbLockable.COMMIT ) ;
_userContainer.removeElement( userName ) ;
}
public void removeUser( String groupName , String userName ) throws Exception {
UserHandle user = getUserByName( userName ) ;
UserHandle group = getUserByName( groupName ) ;
boolean isGroup ;
group.open( CdbLockable.READ ) ;
isGroup = group.isGroup() ;
group.close( CdbLockable.COMMIT ) ;
if( ! isGroup ) {
throw new
IllegalArgumentException("Not a group : " + groupName);
}
group.open( CdbLockable.WRITE ) ;
group.removeChild( userName ) ;
group.close( CdbLockable.COMMIT ) ;
try{
user.open( CdbLockable.WRITE ) ;
user.removeParent( groupName ) ;
user.close( CdbLockable.COMMIT ) ;
}catch( Exception ee ){
group.open( CdbLockable.WRITE ) ;
group.addChild( userName ) ;
group.close( CdbLockable.COMMIT ) ;
throw ee ;
}
}
private String [] getAllParents( String userName ) throws Exception {
UserHandle user = getUserByName( userName ) ;
String [] parents ;
user.open( CdbLockable.READ ) ;
parents = user.getParents() ;
user.close( CdbLockable.COMMIT ) ;
Hashtable<String,String> hash = new Hashtable<>() ;
for (String parent : parents) {
hash.put(parent, parent);
String[] x = getAllParents(parent);
for (String aX : x) {
hash.put(aX, aX);
}
}
String[] result = new String[hash.size()];
Iterator<String> iterator = hash.keySet().iterator();
for( int i = 0 ; iterator.hasNext(); i++ ){
result[i] = iterator.next();
}
return result ;
}
public UserPrivileges getUserPrivileges( String userName ) throws Exception {
UserHandle user ;
try{
user = getUserByName( userName ) ;
}catch( Exception ee ){
return new UserPrivileges( userName ) ;
}
String [] parents ;
UserPrivileges myPrivs;
user.open( CdbLockable.READ ) ;
parents = user.getParents() ;
myPrivs = user.getUserPrivileges() ;
user.close( CdbLockable.COMMIT ) ;
UserPrivileges upper = new UserPrivileges() ;
for (String parent : parents) {
upper.mergeHorizontal(getUserPrivileges(parent));
}
myPrivs.mergeVertical( upper ) ;
return myPrivs ;
}
public void addUser( String groupName , String userName ) throws Exception {
UserHandle user = getUserByName( userName ) ;
UserHandle group = getUserByName( groupName ) ;
String [] parents = getAllParents( groupName ) ;
int i;
for( i = 0 ;
( i < parents.length ) &&
( ! parents[i].equals(userName) ) ; i++ ) {
}
if( i < parents.length ) {
throw new
IllegalArgumentException("would create loop >" + groupName + '-' + userName + '<');
}
boolean isGroup ;
String [] childs ;
group.open( CdbLockable.READ ) ;
isGroup = group.isGroup() ;
childs = group.getChilds() ;
group.close( CdbLockable.COMMIT ) ;
if( ! isGroup ) {
throw new
IllegalArgumentException("Not a group : " + groupName);
}
group.open( CdbLockable.WRITE ) ;
try{
group.addChild( userName ) ;
} finally{
group.close( CdbLockable.COMMIT ) ;
}
try{
user.open( CdbLockable.WRITE ) ;
user.addParent( groupName ) ;
user.close( CdbLockable.COMMIT ) ;
}catch( Exception ee ){
group.open( CdbLockable.WRITE ) ;
group.removeChild( userName ) ;
group.close( CdbLockable.COMMIT ) ;
throw ee ;
}
}
public UserHandle createUser( String name )
throws CdbException , InterruptedException {
return createUser( name , false ) ;
}
public UserHandle createGroup( String name )
throws CdbException , InterruptedException {
return createUser( name , true ) ;
}
public UserHandle createUser( String name , boolean isGroup )
throws CdbException , InterruptedException {
UserHandle user =
(UserHandle)
_userContainer.createElement( name ) ;
user.open( CdbLockable.WRITE ) ;
user.setAttribute( "e-mail" , "unknown" ) ;
user.setAttribute( "password" , "*" ) ;
user.setAttribute( "allowed" , new String[0] ) ;
user.setAttribute( "denied" , new String[0] ) ;
user.setAttribute( "parents" , new String[0] ) ;
if( isGroup ){
user.setAttribute( "mode" , "group" ) ;
user.setAttribute( "childs" , new String[0] ) ;
}else{
user.setAttribute( "mode" , "user" ) ;
}
user.close( CdbLockable.COMMIT ) ;
return user ;
}
public String [] getUserNames(){
return _userContainer.getElementNames() ;
}
public UserHandle
getUserByName( String name )
throws CdbException , InterruptedException {
return (UserHandle)
_userContainer.getElementByName( name ) ;
}
}