package org.basex.core.cmd;
import static org.basex.core.Text.*;
import java.io.IOException;
import org.basex.core.CommandBuilder;
import org.basex.core.User;
import org.basex.core.Commands.CmdPerm;
import org.basex.data.Data;
import org.basex.util.Util;
/**
* Evaluates the 'grant' command and grants permissions to users.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class Grant extends AUser {
/** Permission. */
private int prm = -1;
/**
* Default constructor.
* @param perm permission
* @param user user name
*/
public Grant(final Object perm, final String user) {
this(perm, user, null);
}
/**
* Constructor, specifying a certain database.
* @param perm permission
* @param user user name
* @param db database
*/
public Grant(final Object perm, final String user, final String db) {
super(perm.toString(), user, db);
}
@Override
protected boolean run() {
// find permission
final CmdPerm cmd = getOption(CmdPerm.class);
if(cmd == CmdPerm.NONE) {
prm = User.NONE;
} else if(cmd == CmdPerm.READ) {
prm = User.READ;
} else if(cmd == CmdPerm.WRITE) {
prm = User.WRITE;
} else if(cmd == CmdPerm.CREATE && args[2] == null) {
prm = User.CREATE;
} else if(cmd == CmdPerm.ADMIN && args[2] == null) {
prm = User.ADMIN;
}
if(prm == -1) return error(PERM_UNKNOWN_X, args[0]);
return run(1, false);
}
@Override
protected boolean run(final String user, final String db) {
// admin cannot be modified
if(user.equals(ADMIN)) return !info(ADMIN_STATIC_X);
// set global permissions
if(db == null) {
context.users.get(user).perm = prm;
context.users.write();
return info(GRANTED_X_X, args[0], user);
}
// set local permissions
try {
final Data data = Open.open(db, context);
User u = data.meta.users.get(user);
// add local user reference
if(u == null) {
u = context.users.get(user).copy();
data.meta.users.create(u);
}
u.perm = prm;
data.meta.dirty = true;
data.flush();
Close.close(data, context);
return info(GRANTED_ON_X_X_X, args[0], user, db);
} catch(final IOException ex) {
Util.debug(ex);
final String msg = ex.getMessage();
return !info(msg.isEmpty() ? DB_NOT_OPENED_X : msg, db);
}
}
@Override
public void build(final CommandBuilder cb) {
cb.init().arg(0).arg(ON, 2).arg(TO, 1);
}
}