use of org.apache.accumulo.core.util.BadArgumentException in project accumulo by apache.
the class TransformingIterator method canSee.
/**
* Indicates whether or not the user is able to see {@code key}. If the user has not supplied authorizations, or the iterator is not in the scan scope, then
* this method simply returns {@code true}. Otherwise, {@code key}'s column visibility is tested against the user-supplied authorizations, and the test result
* is returned. For performance, the test results are cached so that the same visibility is not tested multiple times.
*
* @param key
* the key to test
* @return {@code true} if the key is visible or iterator is not scanning, and {@code false} if not
*/
protected boolean canSee(Key key) {
// Ensure that the visibility (which could have been transformed) parses. Must always do this check, even if visibility is not evaluated.
ByteSequence visibility = key.getColumnVisibilityData();
ColumnVisibility colVis = null;
Boolean parsed = (Boolean) parsedVisibilitiesCache.get(visibility);
if (parsed == null) {
try {
colVis = new ColumnVisibility(visibility.toArray());
parsedVisibilitiesCache.put(visibility, Boolean.TRUE);
} catch (BadArgumentException e) {
log.error("Parse error after transformation : {}", visibility);
parsedVisibilitiesCache.put(visibility, Boolean.FALSE);
if (scanning) {
return false;
} else {
throw e;
}
}
} else if (!parsed) {
if (scanning)
return false;
else
throw new IllegalStateException();
}
Boolean visible = canSeeColumnFamily(key);
if (!scanning || !visible || ve == null || visibleCache == null || visibility.length() == 0)
return visible;
visible = (Boolean) visibleCache.get(visibility);
if (visible == null) {
try {
if (colVis == null)
colVis = new ColumnVisibility(visibility.toArray());
visible = ve.evaluate(colVis);
visibleCache.put(visibility, visible);
} catch (VisibilityParseException | BadArgumentException e) {
log.error("Parse Error", e);
visible = Boolean.FALSE;
}
}
return visible;
}
use of org.apache.accumulo.core.util.BadArgumentException in project accumulo by apache.
the class Shell method execCommand.
public void execCommand(String input, boolean ignoreAuthTimeout, boolean echoPrompt) throws IOException {
audit.log(Level.INFO, getDefaultPrompt() + input);
if (echoPrompt) {
reader.print(getDefaultPrompt());
reader.println(input);
}
if (input.startsWith(COMMENT_PREFIX)) {
return;
}
String[] fields;
try {
fields = new QuotedStringTokenizer(input).getTokens();
} catch (BadArgumentException e) {
printException(e);
++exitCode;
return;
}
if (fields.length == 0)
return;
String command = fields[0];
fields = fields.length > 1 ? Arrays.copyOfRange(fields, 1, fields.length) : new String[] {};
Command sc = null;
if (command.length() > 0) {
try {
// Obtain the command from the command table
sc = commandFactory.get(command);
if (sc == null) {
reader.println(String.format("Unknown command \"%s\". Enter \"help\" for a list possible commands.", command));
reader.flush();
return;
}
long duration = System.nanoTime() - lastUserActivity;
if (!(sc instanceof ExitCommand) && !ignoreAuthTimeout && (duration < 0 || duration > authTimeout)) {
reader.println("Shell has been idle for too long. Please re-authenticate.");
boolean authFailed = true;
do {
String pwd = readMaskedLine("Enter current password for '" + connector.whoami() + "': ", '*');
if (pwd == null) {
reader.println();
return;
}
try {
authFailed = !connector.securityOperations().authenticateUser(connector.whoami(), new PasswordToken(pwd));
} catch (Exception e) {
++exitCode;
printException(e);
}
if (authFailed)
reader.print("Invalid password. ");
} while (authFailed);
lastUserActivity = System.nanoTime();
}
// Get the options from the command on how to parse the string
Options parseOpts = sc.getOptionsWithHelp();
// Parse the string using the given options
CommandLine cl = new BasicParser().parse(parseOpts, fields);
int actualArgLen = cl.getArgs().length;
int expectedArgLen = sc.numArgs();
if (cl.hasOption(helpOption)) {
// Display help if asked to; otherwise execute the command
sc.printHelp(this);
} else if (expectedArgLen != NO_FIXED_ARG_LENGTH_CHECK && actualArgLen != expectedArgLen) {
++exitCode;
// Check for valid number of fixed arguments (if not
// negative; negative means it is not checked, for
// vararg-like commands)
printException(new IllegalArgumentException(String.format("Expected %d argument%s. There %s %d.", expectedArgLen, expectedArgLen == 1 ? "" : "s", actualArgLen == 1 ? "was" : "were", actualArgLen)));
sc.printHelp(this);
} else {
int tmpCode = sc.execute(input, cl, this);
exitCode += tmpCode;
reader.flush();
}
} catch (ConstraintViolationException e) {
++exitCode;
printConstraintViolationException(e);
} catch (TableNotFoundException e) {
++exitCode;
if (getTableName().equals(e.getTableName()))
setTableName("");
printException(e);
} catch (ParseException e) {
// option when the user is asking for help
if (!(e instanceof MissingOptionException && (Arrays.asList(fields).contains("-" + helpOption) || Arrays.asList(fields).contains("--" + helpLongOption)))) {
++exitCode;
printException(e);
}
if (sc != null)
sc.printHelp(this);
} catch (UserInterruptException e) {
++exitCode;
} catch (Exception e) {
++exitCode;
printException(e);
}
} else {
++exitCode;
printException(new BadArgumentException("Unrecognized empty command", command, -1));
}
reader.flush();
}
use of org.apache.accumulo.core.util.BadArgumentException in project accumulo by apache.
the class ConfigCommand method execute.
@Override
public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, IOException, ClassNotFoundException, NamespaceNotFoundException {
reader = shellState.getReader();
final String tableName = cl.getOptionValue(tableOpt.getOpt());
if (tableName != null && !shellState.getConnector().tableOperations().exists(tableName)) {
throw new TableNotFoundException(null, tableName, null);
}
final String namespace = cl.getOptionValue(namespaceOpt.getOpt());
if (namespace != null && !shellState.getConnector().namespaceOperations().exists(namespace)) {
throw new NamespaceNotFoundException(null, namespace, null);
}
if (cl.hasOption(deleteOpt.getOpt())) {
// delete property from table
String property = cl.getOptionValue(deleteOpt.getOpt());
if (property.contains("=")) {
throw new BadArgumentException("Invalid '=' operator in delete operation.", fullCommand, fullCommand.indexOf('='));
}
if (tableName != null) {
if (!Property.isValidTablePropertyKey(property)) {
Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there.");
}
shellState.getConnector().tableOperations().removeProperty(tableName, property);
Shell.log.debug("Successfully deleted table configuration option.");
} else if (namespace != null) {
if (!Property.isValidTablePropertyKey(property)) {
Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there.");
}
shellState.getConnector().namespaceOperations().removeProperty(namespace, property);
Shell.log.debug("Successfully deleted namespace configuration option.");
} else {
if (!Property.isValidZooPropertyKey(property)) {
Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there.");
}
shellState.getConnector().instanceOperations().removeProperty(property);
Shell.log.debug("Successfully deleted system configuration option");
}
} else if (cl.hasOption(setOpt.getOpt())) {
// set property on table
String property = cl.getOptionValue(setOpt.getOpt()), value = null;
if (!property.contains("=")) {
throw new BadArgumentException("Missing '=' operator in set operation.", fullCommand, fullCommand.indexOf(property));
}
final String[] pair = property.split("=", 2);
property = pair[0];
value = pair[1];
if (tableName != null) {
if (!Property.isValidTablePropertyKey(property)) {
throw new BadArgumentException("Invalid per-table property.", fullCommand, fullCommand.indexOf(property));
}
if (property.equals(Property.TABLE_DEFAULT_SCANTIME_VISIBILITY.getKey())) {
// validate that it is a valid expression
new ColumnVisibility(value);
}
shellState.getConnector().tableOperations().setProperty(tableName, property, value);
Shell.log.debug("Successfully set table configuration option.");
} else if (namespace != null) {
if (!Property.isValidTablePropertyKey(property)) {
throw new BadArgumentException("Invalid per-table property.", fullCommand, fullCommand.indexOf(property));
}
if (property.equals(Property.TABLE_DEFAULT_SCANTIME_VISIBILITY.getKey())) {
// validate that it is a valid expression
new ColumnVisibility(value);
}
shellState.getConnector().namespaceOperations().setProperty(namespace, property, value);
Shell.log.debug("Successfully set table configuration option.");
} else {
if (!Property.isValidZooPropertyKey(property)) {
throw new BadArgumentException("Property cannot be modified in zookeeper", fullCommand, fullCommand.indexOf(property));
}
shellState.getConnector().instanceOperations().setProperty(property, value);
Shell.log.debug("Successfully set system configuration option");
}
} else {
// display properties
final TreeMap<String, String> systemConfig = new TreeMap<>();
systemConfig.putAll(shellState.getConnector().instanceOperations().getSystemConfiguration());
final String outputFile = cl.getOptionValue(outputFileOpt.getOpt());
final PrintFile printFile = outputFile == null ? null : new PrintFile(outputFile);
final TreeMap<String, String> siteConfig = new TreeMap<>();
siteConfig.putAll(shellState.getConnector().instanceOperations().getSiteConfiguration());
final TreeMap<String, String> defaults = new TreeMap<>();
for (Entry<String, String> defaultEntry : DefaultConfiguration.getInstance()) {
defaults.put(defaultEntry.getKey(), defaultEntry.getValue());
}
final TreeMap<String, String> namespaceConfig = new TreeMap<>();
if (tableName != null) {
String n = Namespaces.getNamespaceName(shellState.getInstance(), Tables.getNamespaceId(shellState.getInstance(), Tables.getTableId(shellState.getInstance(), tableName)));
for (Entry<String, String> e : shellState.getConnector().namespaceOperations().getProperties(n)) {
namespaceConfig.put(e.getKey(), e.getValue());
}
}
Iterable<Entry<String, String>> acuconf = shellState.getConnector().instanceOperations().getSystemConfiguration().entrySet();
if (tableName != null) {
acuconf = shellState.getConnector().tableOperations().getProperties(tableName);
} else if (namespace != null) {
acuconf = shellState.getConnector().namespaceOperations().getProperties(namespace);
}
final TreeMap<String, String> sortedConf = new TreeMap<>();
for (Entry<String, String> propEntry : acuconf) {
sortedConf.put(propEntry.getKey(), propEntry.getValue());
}
for (Entry<String, String> propEntry : acuconf) {
final String key = propEntry.getKey();
// specified, or all of them if none specified
if (cl.hasOption(filterOpt.getOpt()) && !key.contains(cl.getOptionValue(filterOpt.getOpt()))) {
continue;
}
if ((tableName != null || namespace != null) && !Property.isValidTablePropertyKey(key)) {
continue;
}
COL2 = Math.max(COL2, propEntry.getKey().length() + 3);
}
final ArrayList<String> output = new ArrayList<>();
printConfHeader(output);
for (Entry<String, String> propEntry : sortedConf.entrySet()) {
final String key = propEntry.getKey();
// specified, or all of them if none specified
if (cl.hasOption(filterOpt.getOpt()) && !key.contains(cl.getOptionValue(filterOpt.getOpt()))) {
continue;
}
if ((tableName != null || namespace != null) && !Property.isValidTablePropertyKey(key)) {
continue;
}
String siteVal = siteConfig.get(key);
String sysVal = systemConfig.get(key);
String curVal = propEntry.getValue();
String dfault = defaults.get(key);
String nspVal = namespaceConfig.get(key);
boolean printed = false;
if (dfault != null && key.toLowerCase().contains("password")) {
siteVal = sysVal = dfault = curVal = curVal.replaceAll(".", "*");
}
if (sysVal != null) {
if (defaults.containsKey(key) && !Property.getPropertyByKey(key).isExperimental()) {
printConfLine(output, "default", key, dfault);
printed = true;
}
if (!defaults.containsKey(key) || !defaults.get(key).equals(siteVal)) {
printConfLine(output, "site", printed ? " @override" : key, siteVal == null ? "" : siteVal);
printed = true;
}
if (!siteConfig.containsKey(key) || !siteVal.equals(sysVal)) {
printConfLine(output, "system", printed ? " @override" : key, sysVal);
printed = true;
}
}
if (nspVal != null) {
if (!systemConfig.containsKey(key) || !sysVal.equals(nspVal)) {
printConfLine(output, "namespace", printed ? " @override" : key, nspVal);
printed = true;
}
}
// show per-table value only if it is different (overridden)
if (tableName != null && !curVal.equals(nspVal)) {
printConfLine(output, "table", printed ? " @override" : key, curVal);
} else if (namespace != null && !curVal.equals(sysVal)) {
printConfLine(output, "namespace", printed ? " @override" : key, curVal);
}
}
printConfFooter(output);
shellState.printLines(output.iterator(), !cl.hasOption(disablePaginationOpt.getOpt()), printFile);
if (printFile != null) {
printFile.close();
}
}
return 0;
}
use of org.apache.accumulo.core.util.BadArgumentException in project accumulo by apache.
the class ConditionalWriterImpl method isVisible.
private boolean isVisible(ByteSequence cv) {
Text testVis = new Text(cv.toArray());
if (testVis.getLength() == 0)
return true;
Boolean b = cache.get(testVis);
if (b != null)
return b;
try {
Boolean bb = ve.evaluate(new ColumnVisibility(testVis));
cache.put(new Text(testVis), bb);
return bb;
} catch (VisibilityParseException | BadArgumentException e) {
return false;
}
}
use of org.apache.accumulo.core.util.BadArgumentException in project accumulo by apache.
the class RevokeCommand method execute.
@Override
public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws Exception {
user = cl.hasOption(userOpt.getOpt()) ? cl.getOptionValue(userOpt.getOpt()) : shellState.getConnector().whoami();
permission = cl.getArgs()[0].split("\\.", 2);
if (cl.hasOption(systemOpt.getOpt()) && permission[0].equalsIgnoreCase("System")) {
try {
shellState.getConnector().securityOperations().revokeSystemPermission(user, SystemPermission.valueOf(permission[1]));
Shell.log.debug("Revoked from " + user + " the " + permission[1] + " permission");
} catch (IllegalArgumentException e) {
throw new BadArgumentException("No such system permission", fullCommand, fullCommand.indexOf(cl.getArgs()[0]));
}
} else if (permission[0].equalsIgnoreCase("Table")) {
super.execute(fullCommand, cl, shellState);
} else if (permission[0].equalsIgnoreCase("Namespace")) {
if (cl.hasOption(optNamespace.getOpt())) {
try {
shellState.getConnector().securityOperations().revokeNamespacePermission(user, cl.getOptionValue(optNamespace.getOpt()), NamespacePermission.valueOf(permission[1]));
} catch (IllegalArgumentException e) {
throw new BadArgumentException("No such namespace permission", fullCommand, fullCommand.indexOf(cl.getArgs()[0]));
}
} else {
throw new BadArgumentException("No namespace specified to apply permission to", fullCommand, fullCommand.indexOf(cl.getArgs()[0]));
}
} else {
throw new BadArgumentException("Unrecognized permission", fullCommand, fullCommand.indexOf(cl.getArgs()[0]));
}
return 0;
}
Aggregations