/*
* Copyright 1999-2008 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.nimbustools.auto_config.groupauthz.harness;
import org.globus.workspace.groupauthz.Group;
import org.nimbustools.auto_config.TextFile;
import java.io.File;
public class AddDeleteCommon extends Action {
public AddDeleteCommon(String confPath, String[] args, boolean debug)
throws Exception {
super(confPath, args, debug);
}
protected String dnInQuestion(String action) throws Exception {
if (this.args.length > 1) {
throw new Exception(
"Requires just one argument, the DN to " + action +
"(you may need to quote DN with spaces?).");
}
if (this.args.length == 0 || this.args[0].trim().length() == 0) {
throw new Exception(
"Requires just one argument, the DN to " + action + ".");
}
return this.args[0].trim();
}
protected Group[] getGroups() throws Exception {
Group[] groups = this.groupAuthz.getGroups();
if (groups == null || groups.length == 0) {
throw new Exception("The authz module has no groups " +
"configured, can not proceed.");
}
return groups;
}
protected boolean scanAll(String dn,
Group[] groups) throws Exception {
for (int i = 0; i < groups.length; i++) {
final Group group = groups[i];
if (group != null && this.findID(dn, group)) {
return true;
}
}
return false;
}
// returns true if something was removed
protected boolean deleteAllInstances(String dn,
Group[] groups) throws Exception {
boolean ret = false;
for (int i = 0; i < groups.length; i++) {
final Group group = groups[i];
if (group != null && this.findID(dn, group)) {
this.deleteDN(dn,
group.getIdentitiesFilePath(),
group.getName());
ret = true;
}
}
return ret;
}
// removing a line changes the arraylist size (TextFile is an arraylist),
// so to make sure all entries are gone, we need to iterate again from
// scratch if one is removed.
// Returns true if there was a removal
private boolean _removeAttempt(TextFile textFile,
String dn) {
final int size = textFile.size();
for (int i = 0; i < size; i++) {
final String line = (String) textFile.get(i);
if (line != null && line.trim().length() > 0) {
if (line.trim().equals(dn)) {
textFile.remove(i);
return true;
}
}
}
return false;
}
protected void deleteDN(String dn,
String filePath,
String groupName) throws Exception {
if (dn == null || dn.trim().length() == 0) {
throw new Exception("unexpected, dn is empty or null");
}
if (filePath == null || filePath.trim().length() == 0) {
throw new Exception("unexpected, filePath is empty or null");
}
final File file = new File(filePath);
if (!file.exists()) {
throw new Exception(
"unexpected, file does not exist: '" + filePath + "'");
}
final TextFile textFile = new TextFile(filePath);
if (textFile.isEmpty()) {
return;
}
if (!file.canWrite()) {
throw new Exception(
"This file is not writable: '" + filePath + "'");
}
int count = 0;
// see note for _removeAttempt
while (_removeAttempt(textFile, dn)) {
count++;
}
if (count > 0) {
textFile.writeFile(file);
if (count == 1) {
System.out.println("Deleted from group '" + groupName + "'");
} else {
System.out.println("Deleted " + count +
" instances of the DN from group '" + groupName + "'");
}
System.out.println(
" - access list: '" + file.getAbsolutePath() + "'");
}
}
protected boolean findID(String DN, Group group) {
if (group == null) {
return false;
}
String[] ids = group.getIdentities();
if (ids == null || ids.length == 0) {
return false;
}
for (int i = 0; i < ids.length; i++) {
if (ids[i] != null && ids[i].trim().length() != 0) {
if (ids[i].equals(DN)) {
return true;
}
}
}
return false;
}
}