Adding configuration file editor utilities.
This commit is contained in:
parent
18646f81b2
commit
89e9889865
@ -43,6 +43,8 @@ WEBAPP_NAME = CasaAuthTokenSvc
|
||||
WEBAPP_EXT = war
|
||||
MODULE_NAME = CasaAuthToken
|
||||
MODULE_EXT = jar
|
||||
UTIL_MODULE_NAME = CasaAuthTokenUtil
|
||||
UTIL_MODULE_EXT = jar
|
||||
|
||||
JAVAFILES = src/com/novell/casa/authtoksvc/ProtoDefs.java \
|
||||
src/com/novell/casa/authtoksvc/AuthMechConfig.java \
|
||||
@ -69,7 +71,13 @@ JAVAFILES = src/com/novell/casa/authtoksvc/ProtoDefs.java \
|
||||
src/com/novell/casa/authtoksvc/GetAuthTokReqMsg.java \
|
||||
src/com/novell/casa/authtoksvc/GetAuthTokRespMsg.java \
|
||||
src/com/novell/casa/authtoksvc/Krb5Authenticate.java \
|
||||
src/com/novell/casa/authtoksvc/PwdAuthenticate.java
|
||||
src/com/novell/casa/authtoksvc/PwdAuthenticate.java \
|
||||
src/com/novell/casa/authtoksvc/IVerifySetting.java \
|
||||
src/com/novell/casa/authtoksvc/SettingsFileUtil.java \
|
||||
src/com/novell/casa/authtoksvc/AuthPolicyEditor.java \
|
||||
src/com/novell/casa/authtoksvc/AuthTokenSettingsEditor.java \
|
||||
src/com/novell/casa/authtoksvc/IdenTokenSettingsEditor.java \
|
||||
src/com/novell/casa/authtoksvc/SvcSettingsEditor.java
|
||||
|
||||
BUILDDIR = build
|
||||
|
||||
@ -77,6 +85,8 @@ WEBAPP = $(WEBAPP_NAME).$(WEBAPP_EXT)
|
||||
|
||||
AUTHTOKEN_FILES = -C $(BUILDDIR)/webapp/WEB-INF/classes com
|
||||
|
||||
AUTHTOKEN_UTIL_FILES = -C $(BUILDDIR)/webapp/WEB-INF/classes com
|
||||
|
||||
CLASSES = $(addprefix $(BUILDDIR)/, $(JAVAFILES:%.java=%.class))
|
||||
|
||||
#AXIS_LIBS = $(AXIS_JARS_DIR)/axis.jar:$(AXIS_JARS_DIR)/axis-ant.jar:$(AXIS_JARS_DIR)/commons-discovery-0.2.jar:$(AXIS_JARS_DIR)/commons-logging-1.0.4.jar:$(AXIS_JARS_DIR)/commons-logging-api.jar:$(AXIS_JARS_DIR)/jaxrpc.jar:$(AXIS_JARS_DIR)/log4j-1.2.8.jar:$(AXIS_JARS_DIR)/saaj.jar:$(AXIS_JARS_DIR)/wsdl4j-1.5.1.jar:$(AXIS_JARS_DIR)/wss4j-1.5.0.jar:$(AXIS_JARS_DIR)/xalan.jar:$(AXIS_JARS_DIR)/xercesImpl.jar:$(AXIS_JARS_DIR)/xml-apis.jar:$(AXIS_JARS_DIR)/xmlsec-1.2.1.jar
|
||||
@ -88,7 +98,7 @@ CLASSPATH = $(AXIS_LIBS):$(IDENT_ABSTRACTION_DIR)/identity-abstraction.jar:$(LIB
|
||||
|
||||
CUR_DIR := $(shell pwd)
|
||||
|
||||
all: $(BUILDDIR)/$(WEBAPP) $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT)
|
||||
all: $(BUILDDIR)/$(WEBAPP) $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(BUILDDIR)/$(UTIL_MODULE_NAME).$(UTIL_MODULE_EXT)
|
||||
|
||||
$(BUILDDIR)/%.class: %.java
|
||||
@echo [======== Compiling $@ ========]
|
||||
@ -117,6 +127,11 @@ $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT): $(BUILDDIR) $(CLASSES)
|
||||
jar cvf $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(AUTHTOKEN_FILES)
|
||||
cp $(BUILDDIR)/$(MODULE_NAME).$(MODULE_EXT) $(LIBDIR)/java/
|
||||
|
||||
$(BUILDDIR)/$(UTIL_MODULE_NAME).$(UTIL_MODULE_EXT): $(BUILDDIR) $(CLASSES)
|
||||
@echo [======== Jarring $@ ========]
|
||||
jar cvf $(BUILDDIR)/$(UTIL_MODULE_NAME).$(UTIL_MODULE_EXT) $(AUTHTOKEN_UTIL_FILES)
|
||||
cp $(BUILDDIR)/$(UTIL_MODULE_NAME).$(UTIL_MODULE_EXT) $(LIBDIR)/java/
|
||||
|
||||
$(BUILDDIR):
|
||||
[ -d $(BUILDDIR) ] || mkdir -p $(BUILDDIR)
|
||||
[ -d $(BUILDDIR)/webapp ] || mkdir -p $(BUILDDIR)/webapp
|
||||
|
@ -0,0 +1,871 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.apache.xerces.parsers.DOMParser;
|
||||
import org.apache.xml.serialize.OutputFormat;
|
||||
import org.apache.xml.serialize.XMLSerializer;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Formatter;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class for the creation and editing of auth.policy files.
|
||||
*
|
||||
**/
|
||||
public class AuthPolicyEditor
|
||||
{
|
||||
private static final String usage =
|
||||
"java auth_policy_editor -op [-entry realm:mechanismName[:mechanismInfo]] [-refentry realm:mechanismName] -file policyFilePath\n\n" +
|
||||
" where:\n" +
|
||||
" -op - Corresponds to one of the following operations:\n" +
|
||||
" -create - Create new auth policy file\n" +
|
||||
" -list - List auth source entries\n" +
|
||||
" -prepend - Insert auth source entry at the head\n" +
|
||||
" -append - Insert auth source entry at the tail\n" +
|
||||
" -insert - Insert auth source entry after specified reference entry\n" +
|
||||
" -remove - Remove auth source entry\n" +
|
||||
" -file - Path the the auth policy file\n" +
|
||||
" -entry - Auth source entry to be inserted or removed. Must be followed by\n" +
|
||||
" a string formated as follows:\n" +
|
||||
" insert operations format: realm:mechanismName or realm:mechanismName:mechanismInfo\n" +
|
||||
" remove operations format: realm:mechanismName\n" +
|
||||
" -refentry - Reference auth source entry. Must be followed by a string formated\n" +
|
||||
" as follows: realm:mechanismName\n";
|
||||
|
||||
private static final String initialPolicy =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<auth_policy>\n" +
|
||||
"</auth_policy>\n";
|
||||
|
||||
private final static String AuthSourceElementName = "auth_source";
|
||||
private final static String RealmElementName = "realm";
|
||||
private final static String MechanismElementName = "mechanism";
|
||||
private final static String MechanismInfoElementName = "mechanism_info";
|
||||
private final static String Krb5Mechanism = "Krb5Authenticate";
|
||||
private final static String PwdMechanism = "PwdAuthenticate";
|
||||
|
||||
|
||||
/**
|
||||
* Returns the formal mechanism name if well known
|
||||
*
|
||||
* @param mechName Name of mechanism.
|
||||
* @return Mechanism formal name.
|
||||
*/
|
||||
private static String mechFormalName(String mechName)
|
||||
{
|
||||
String formalName;
|
||||
|
||||
if (mechName.compareToIgnoreCase(Krb5Mechanism) == 0)
|
||||
formalName = Krb5Mechanism;
|
||||
else if (mechName.compareToIgnoreCase(PwdMechanism) == 0)
|
||||
formalName = PwdMechanism;
|
||||
else
|
||||
formalName = mechName;
|
||||
|
||||
return formalName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the contents of the specified file with the provided
|
||||
* policy document.
|
||||
*
|
||||
* @param filePath Path to policy file to be updated.
|
||||
* @param doc Policy document.
|
||||
* @return True if successful.
|
||||
*/
|
||||
private static boolean updateFile(String filePath, Document doc)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
// Update the file with the specified document
|
||||
// after removing the text nodes.
|
||||
try
|
||||
{
|
||||
// Remove text nodes
|
||||
Element root = doc.getDocumentElement();
|
||||
Node child;
|
||||
Node next = (Node) root.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.TEXT_NODE)
|
||||
{
|
||||
// Remove the node
|
||||
root.removeChild(child);
|
||||
}
|
||||
}
|
||||
|
||||
// Update file
|
||||
File f = new File(filePath);
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
OutputFormat format = new OutputFormat(doc);
|
||||
XMLSerializer serializer = new XMLSerializer(out, format);
|
||||
serializer.serialize(doc.getDocumentElement());
|
||||
out.close();
|
||||
|
||||
result = true;
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("Error writing to file " + filePath + ", exception: " + e.toString());
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("SecurityException writting to file " + filePath);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets document for the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @return Document representation of the policy file.
|
||||
*/
|
||||
private static Document getPolicyFileDoc(String filePath)
|
||||
{
|
||||
Document doc = null;
|
||||
|
||||
try
|
||||
{
|
||||
// Get an input stream to read from policy file
|
||||
File f = new File(filePath);
|
||||
FileInputStream inStream = new FileInputStream(f);
|
||||
InputSource source = new InputSource(inStream);
|
||||
|
||||
DOMParser parser = new DOMParser();
|
||||
parser.parse(source);
|
||||
doc = parser.getDocument();
|
||||
|
||||
inStream.close();
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
System.err.println("Policy file " + filePath + " not found");
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.err.println("SecurityException accessing " + filePath);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.err.println("IOException accessing " + filePath + " Exception=" + e.toString());
|
||||
}
|
||||
catch (SAXException e)
|
||||
{
|
||||
System.err.println("Policy file " + filePath + " format error");
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a starting policy document
|
||||
*
|
||||
* @return Starting policy document.
|
||||
*/
|
||||
private static Document getPolicyDoc()
|
||||
{
|
||||
Document doc = null;
|
||||
|
||||
try
|
||||
{
|
||||
StringReader reader = new StringReader(initialPolicy);
|
||||
InputSource source = new InputSource(reader);
|
||||
|
||||
DOMParser parser = new DOMParser();
|
||||
parser.parse(source);
|
||||
doc = parser.getDocument();
|
||||
reader.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
System.err.println("Program error, exception: " + e.toString());
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* List the auth_source entries in the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
private static boolean performListOperation(String filePath)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// List the auth sources present in the policy file
|
||||
Document doc = getPolicyFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Go through the elements of the document
|
||||
Element root = doc.getDocumentElement();
|
||||
Node auth_source_node;
|
||||
Node next_auth_source_node = root.getFirstChild();
|
||||
while ((auth_source_node = next_auth_source_node) != null)
|
||||
{
|
||||
next_auth_source_node = auth_source_node.getNextSibling();
|
||||
if (auth_source_node.getNodeType() == Node.ELEMENT_NODE
|
||||
&& auth_source_node.getLocalName().compareToIgnoreCase("auth_source") == 0)
|
||||
{
|
||||
System.out.println("Auth_Source: ");
|
||||
|
||||
// We are dealing with an auth_source, display its children.
|
||||
Node child;
|
||||
Node next = auth_source_node.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
if (child.getLocalName().compareToIgnoreCase("realm") == 0)
|
||||
{
|
||||
System.out.println(" Identity source: " + child.getTextContent());
|
||||
}
|
||||
else if (child.getLocalName().compareToIgnoreCase("mechanism") == 0)
|
||||
{
|
||||
System.out.println(" Authentication Mechanism: " + child.getTextContent());
|
||||
}
|
||||
else if (child.getLocalName().compareToIgnoreCase("mechanism_info") == 0)
|
||||
{
|
||||
System.out.println(" Authentication Mechanism Info: " + child.getTextContent());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create policy file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
private static boolean performCreateOperation(String filePath)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// create a policy file
|
||||
Document doc = getPolicyDoc();
|
||||
if (doc != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
File f = new File(filePath);
|
||||
boolean createStatus = f.createNewFile();
|
||||
if (createStatus == true)
|
||||
{
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
OutputFormat format = new OutputFormat(doc);
|
||||
XMLSerializer serializer = new XMLSerializer(out, format);
|
||||
serializer.serialize(doc.getDocumentElement());
|
||||
out.close();
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("File " + filePath + " already exists");
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("Error creating file " + filePath + ", exception: " + e.toString());
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("SecurityException creating " + filePath);
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepend the auth_source entry to the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @param entry Auth_source entry to be prepended. Entry is formated as
|
||||
* follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
* is optional).
|
||||
* @return True if operation is successfully performed.
|
||||
*/
|
||||
private static boolean performPrependOperation(String filePath, String entry)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Prepend auth source entry to the policy file
|
||||
Document doc = getPolicyFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Parse the entry into its components. Entry is formated as
|
||||
// follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
// is optional).
|
||||
String[] entryComponents = entry.split(":");
|
||||
if (entryComponents.length >= 2
|
||||
&& entryComponents.length <= 3)
|
||||
{
|
||||
// Create and prepend the entry elements
|
||||
Element root = doc.getDocumentElement();
|
||||
Element auth_source_element = doc.createElement(AuthSourceElementName);
|
||||
Element realm_element = doc.createElement(RealmElementName);
|
||||
realm_element.setTextContent(entryComponents[0]);
|
||||
auth_source_element.appendChild(realm_element);
|
||||
Element mechanism_element = doc.createElement(MechanismElementName);
|
||||
mechanism_element.setTextContent(mechFormalName(entryComponents[1]));
|
||||
auth_source_element.appendChild(mechanism_element);
|
||||
if (entryComponents.length == 3)
|
||||
{
|
||||
Element mechanism_info_element = doc.createElement(MechanismInfoElementName);
|
||||
mechanism_info_element.setTextContent(mechFormalName(entryComponents[2]));
|
||||
auth_source_element.appendChild(mechanism_info_element);
|
||||
}
|
||||
|
||||
Element firstEntry = null;
|
||||
Node child;
|
||||
Node next = (Node) root.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
// This is the first entry
|
||||
firstEntry = (Element) child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (firstEntry != null)
|
||||
root.insertBefore(auth_source_element, firstEntry);
|
||||
else
|
||||
root.appendChild(auth_source_element);
|
||||
|
||||
// Update the file
|
||||
opPerformed = updateFile(filePath, doc);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Invalid entry format");
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the auth_source entry to the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @param entry Auth_source entry to be appended. Entry is formated as
|
||||
* follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
* is optional).
|
||||
* @return True if operation is successfully performed.
|
||||
*/
|
||||
private static boolean performAppendOperation(String filePath, String entry)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Append auth source entry to the policy file
|
||||
Document doc = getPolicyFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Parse the entry into its components. Entry is formated as
|
||||
// follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
// is optional).
|
||||
String[] entryComponents = entry.split(":");
|
||||
if (entryComponents.length >= 2
|
||||
&& entryComponents.length <= 3)
|
||||
{
|
||||
// Create and append the entry elements
|
||||
Element root = doc.getDocumentElement();
|
||||
Element auth_source_element = doc.createElement(AuthSourceElementName);
|
||||
Element realm_element = doc.createElement(RealmElementName);
|
||||
realm_element.setTextContent(entryComponents[0]);
|
||||
auth_source_element.appendChild(realm_element);
|
||||
Element mechanism_element = doc.createElement(MechanismElementName);
|
||||
mechanism_element.setTextContent(mechFormalName(entryComponents[1]));
|
||||
auth_source_element.appendChild(mechanism_element);
|
||||
if (entryComponents.length == 3)
|
||||
{
|
||||
Element mechanism_info_element = doc.createElement(MechanismInfoElementName);
|
||||
mechanism_info_element.setTextContent(mechFormalName(entryComponents[2]));
|
||||
auth_source_element.appendChild(mechanism_info_element);
|
||||
}
|
||||
root.appendChild(auth_source_element);
|
||||
|
||||
// Update the file
|
||||
opPerformed = updateFile(filePath, doc);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Invalid entry format");
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert the auth_source entry to the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @param entry Auth_source entry to be inserted. Entry is formated as
|
||||
* follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
* is optional).
|
||||
* @param refEntry Reference auth_source entry (New entry is inserted after
|
||||
* it). Entry is formated as follows: realm:mech.
|
||||
* @return True if operation is successfully performed.
|
||||
*/
|
||||
private static boolean performInsertOperation(String filePath, String entry, String refEntry)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Remove auth sources present in the policy file
|
||||
Document doc = getPolicyFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Parse the entries into their components. Entry is formated as
|
||||
// follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
// is optional).
|
||||
String[] entryComponents = entry.split(":");
|
||||
String[] refEntryComponents = refEntry.split(":");
|
||||
if (refEntryComponents.length == 2
|
||||
&& entryComponents.length >= 2
|
||||
&& entryComponents.length <= 3)
|
||||
{
|
||||
// Go through the elements of the document
|
||||
Element root = doc.getDocumentElement();
|
||||
Node curr_auth_source_node;
|
||||
Node next_auth_source_node = root.getFirstChild();
|
||||
while ((curr_auth_source_node = next_auth_source_node) != null)
|
||||
{
|
||||
next_auth_source_node = curr_auth_source_node.getNextSibling();
|
||||
if (curr_auth_source_node.getNodeType() == Node.ELEMENT_NODE
|
||||
&& curr_auth_source_node.getLocalName().compareToIgnoreCase("auth_source") == 0)
|
||||
{
|
||||
// We are dealing with an auth_source, check if this is the
|
||||
// reference entry.
|
||||
boolean realmMatch = false;
|
||||
boolean mechanismMatch = false;
|
||||
|
||||
Node child;
|
||||
Node next = curr_auth_source_node.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
if (child.getLocalName().compareToIgnoreCase(RealmElementName) == 0)
|
||||
{
|
||||
// Compare the realm name
|
||||
if (child.getTextContent().compareToIgnoreCase(refEntryComponents[0]) == 0)
|
||||
realmMatch = true;
|
||||
}
|
||||
else if (child.getLocalName().compareToIgnoreCase(MechanismElementName) == 0)
|
||||
{
|
||||
// Compare the realm name
|
||||
if (child.getTextContent().compareToIgnoreCase(mechFormalName(refEntryComponents[1])) == 0)
|
||||
mechanismMatch = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Insert entry after current entry if we have a match for the reference entry
|
||||
if (realmMatch && mechanismMatch)
|
||||
{
|
||||
Element auth_source_element = doc.createElement(AuthSourceElementName);
|
||||
Element realm_element = doc.createElement(RealmElementName);
|
||||
realm_element.setTextContent(entryComponents[0]);
|
||||
auth_source_element.appendChild(realm_element);
|
||||
Element mechanism_element = doc.createElement(MechanismElementName);
|
||||
mechanism_element.setTextContent(mechFormalName(entryComponents[1]));
|
||||
auth_source_element.appendChild(mechanism_element);
|
||||
if (entryComponents.length == 3)
|
||||
{
|
||||
Element mechanism_info_element = doc.createElement(MechanismInfoElementName);
|
||||
mechanism_info_element.setTextContent(mechFormalName(entryComponents[2]));
|
||||
auth_source_element.appendChild(mechanism_info_element);
|
||||
}
|
||||
curr_auth_source_node.getNextSibling();
|
||||
Element nextEntry = null;
|
||||
next = (Node) curr_auth_source_node.getNextSibling();;
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
// This is the next entry
|
||||
nextEntry = (Element) child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (nextEntry != null)
|
||||
root.insertBefore(auth_source_element, nextEntry);
|
||||
else
|
||||
root.appendChild(auth_source_element);
|
||||
|
||||
// Update the file
|
||||
opPerformed = updateFile(filePath, doc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Invalid entry format");
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the auth_source entry from the specified policy file.
|
||||
*
|
||||
* @param filePath Path to the policy file.
|
||||
* @param entry Auth_source entry to be removed. Entry is formated as
|
||||
* follows: realm:mech.
|
||||
* @return True if operation is successfully performed.
|
||||
*/
|
||||
private static boolean performRemoveOperation(String filePath, String entry)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Remove auth sources present in the policy file
|
||||
Document doc = getPolicyFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Parse the entry into its components. Entry is formated as
|
||||
// follows: realm:mech:mechinfo (Note that the mechinfo
|
||||
// is optional).
|
||||
String[] entryComponents = entry.split(":");
|
||||
if (entryComponents.length == 2)
|
||||
{
|
||||
// Go through the elements of the document
|
||||
Element root = doc.getDocumentElement();
|
||||
Node auth_source_node;
|
||||
Node next_auth_source_node = root.getFirstChild();
|
||||
while ((auth_source_node = next_auth_source_node) != null)
|
||||
{
|
||||
next_auth_source_node = auth_source_node.getNextSibling();
|
||||
if (auth_source_node.getNodeType() == Node.ELEMENT_NODE
|
||||
&& auth_source_node.getLocalName().compareToIgnoreCase("auth_source") == 0)
|
||||
{
|
||||
// We are dealing with an auth_source, check if this is the entry
|
||||
// that must be removed.
|
||||
boolean realmMatch = false;
|
||||
boolean mechanismMatch = false;
|
||||
|
||||
Node child;
|
||||
Node next = auth_source_node.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
if (child.getLocalName().compareToIgnoreCase(RealmElementName) == 0)
|
||||
{
|
||||
// Compare the realm name
|
||||
if (child.getTextContent().compareToIgnoreCase(entryComponents[0]) == 0)
|
||||
realmMatch = true;
|
||||
}
|
||||
else if (child.getLocalName().compareToIgnoreCase(MechanismElementName) == 0)
|
||||
{
|
||||
// Compare the realm name
|
||||
if (child.getTextContent().compareToIgnoreCase(mechFormalName(entryComponents[1])) == 0)
|
||||
mechanismMatch = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove current entry if it matches
|
||||
if (realmMatch && mechanismMatch)
|
||||
{
|
||||
System.out.println("RemovingChild");
|
||||
root.removeChild(auth_source_node);
|
||||
|
||||
// Update the file
|
||||
opPerformed = updateFile(filePath, doc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Invalid entry format");
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applications Entry Point
|
||||
*
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
String op = null;
|
||||
boolean opPerformed = false;
|
||||
boolean argumentsError = false;
|
||||
String filePath = null;
|
||||
String entry = null;
|
||||
String refEntry = null;
|
||||
|
||||
// Process the command line arguments
|
||||
for (int i = 0; i < args.length; i++)
|
||||
{
|
||||
// Proceed based on the command
|
||||
if (args[i].compareToIgnoreCase("-list") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "list";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-create") == 0)
|
||||
{
|
||||
// Create operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "create";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-prepend") == 0)
|
||||
{
|
||||
// Prepend operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "prepend";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-append") == 0)
|
||||
{
|
||||
// Append operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "append";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-insert") == 0)
|
||||
{
|
||||
// Insert operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "insert";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-remove") == 0)
|
||||
{
|
||||
// Remove operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "remove";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-entry") == 0)
|
||||
{
|
||||
// The next argument should contain the entry information
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
entry = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-refentry") == 0)
|
||||
{
|
||||
// The next argument should contain the reference entry information
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
refEntry = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-file") == 0)
|
||||
{
|
||||
// The next argument should contain the filepath
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
filePath = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed based on the specified parameters
|
||||
if (argumentsError == false)
|
||||
{
|
||||
if (filePath != null && op != null)
|
||||
{
|
||||
System.out.println("Dealing with policy file: " + filePath);
|
||||
|
||||
// Proceed based on the operation requested
|
||||
if (op.compareTo("list") == 0)
|
||||
{
|
||||
opPerformed = performListOperation(filePath);
|
||||
}
|
||||
else if (op.compareTo("create") == 0)
|
||||
{
|
||||
opPerformed = performCreateOperation(filePath);
|
||||
}
|
||||
else if (op.compareTo("prepend") == 0)
|
||||
{
|
||||
// Verify that the required parameters were specified
|
||||
if (entry != null)
|
||||
{
|
||||
opPerformed = performPrependOperation(filePath, entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
else if (op.compareTo("append") == 0)
|
||||
{
|
||||
// Verify that the required parameters were specified
|
||||
if (entry != null)
|
||||
{
|
||||
opPerformed = performAppendOperation(filePath, entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
else if (op.compareTo("insert") == 0)
|
||||
{
|
||||
// Verify that the required parameters were specified
|
||||
if (entry != null && refEntry != null)
|
||||
{
|
||||
opPerformed = performInsertOperation(filePath, entry, refEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
else if (op.compareTo("remove") == 0)
|
||||
{
|
||||
// Verify that the required parameters were specified
|
||||
if (entry != null)
|
||||
{
|
||||
opPerformed = performRemoveOperation(filePath, entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.err.println("Tool error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Display the usage string if we encountered an error with the
|
||||
// command line arguments.
|
||||
if (argumentsError)
|
||||
System.out.print(usage);
|
||||
|
||||
// Set the exit code appropriatedly
|
||||
if (opPerformed)
|
||||
System.exit(0);
|
||||
else
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
@ -0,0 +1,324 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class for the creation and editing of authtoken.settings files.
|
||||
*
|
||||
**/
|
||||
public class AuthTokenSettingsEditor implements IVerifySetting
|
||||
{
|
||||
private static final String usage =
|
||||
"java authtoken_settings_editor -op [settingName [settingValue]] -file settingsFilePath\n\n" +
|
||||
" where:\n" +
|
||||
" -op - Corresponds to one of the following operations:\n" +
|
||||
" -create - Create new authtoken settings file\n" +
|
||||
" -list - List settings\n" +
|
||||
" -get - Get settings, must be followed by settingName parameter\n" +
|
||||
" -set - Set settings, must be followed by settingName and settingValue parameters\n" +
|
||||
" -remove - Remove settings\n" +
|
||||
" -file - Path the the authtoken settings file\n" +
|
||||
" settingName - Name of the setting being retrieved or set\n" +
|
||||
" settingValue - Value of the setting being set\n\n" +
|
||||
" The following settings are valid:\n" +
|
||||
" TokenLifetime\n" +
|
||||
" LifetimeShorter\n";
|
||||
|
||||
private static final String settings =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<settings>\n" +
|
||||
"</settings>\n";
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @return True if the specified setting is valid.
|
||||
*/
|
||||
public boolean validSetting(String setting)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
if (setting.compareToIgnoreCase(AuthTokenConfig.TokenLifetime) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(AuthTokenConfig.LifetimeShorter) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(AuthTokenConfig.IdentityTokenType) == 0)
|
||||
result = true;
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid in conjunction
|
||||
* with the specified value.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @param value The value of the specified setting.
|
||||
* @return The formal name of the setting if found to be valid.
|
||||
*/
|
||||
public String validSettingNameAndValue(String setting,
|
||||
String value)
|
||||
{
|
||||
String validSetting = null;
|
||||
|
||||
if (setting.compareToIgnoreCase(AuthTokenConfig.TokenLifetime) == 0)
|
||||
{
|
||||
// Verify that we are dealing with a numeric value
|
||||
try
|
||||
{
|
||||
Integer.valueOf(value);
|
||||
|
||||
// Good
|
||||
validSetting = AuthTokenConfig.TokenLifetime;
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
System.out.println("Invalid setting value specified");
|
||||
}
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(AuthTokenConfig.LifetimeShorter) == 0)
|
||||
{
|
||||
// Verify that we are dealing with a numeric value
|
||||
try
|
||||
{
|
||||
Integer.valueOf(value);
|
||||
|
||||
// Good
|
||||
validSetting = AuthTokenConfig.LifetimeShorter;
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
System.out.println("Invalid setting value specified");
|
||||
}
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(AuthTokenConfig.IdentityTokenType) == 0)
|
||||
{
|
||||
// Always succeed
|
||||
validSetting = AuthTokenConfig.IdentityTokenType;
|
||||
}
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return validSetting;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applications Entry Point
|
||||
*
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
String op = null;
|
||||
boolean opPerformed = false;
|
||||
boolean argumentsError = false;
|
||||
String filePath = null;
|
||||
String setting = null;
|
||||
String value = null;
|
||||
authtoken_settings_editor editor = new authtoken_settings_editor();
|
||||
|
||||
// Process the command line arguments
|
||||
for (int i = 0; i < args.length; i++)
|
||||
{
|
||||
// Proceed based on the command
|
||||
if (args[i].compareToIgnoreCase("-file") == 0)
|
||||
{
|
||||
// The next argument should contain the filepath
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
filePath = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-list") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "list";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-create") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "create";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-get") == 0)
|
||||
{
|
||||
// Get setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "get";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-set") == 0)
|
||||
{
|
||||
// Set setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "set";
|
||||
|
||||
// The next two arguments should contain the setting name
|
||||
// and the setting value.
|
||||
if (args.length > (i + 2))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
value = args[i + 2];
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-remove") == 0)
|
||||
{
|
||||
// Remove setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "remove";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed based on the specified parameters
|
||||
if (argumentsError == false)
|
||||
{
|
||||
if (filePath != null && op != null)
|
||||
{
|
||||
System.out.println("Dealing with settings file: " + filePath);
|
||||
|
||||
// Proceed based on the operation requested
|
||||
if (op.compareTo("list") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performListOperation(filePath);
|
||||
}
|
||||
else if (op.compareTo("create") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performCreateOperation(filePath, settings);
|
||||
}
|
||||
else if (op.compareTo("get") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performGetOperation(filePath, setting, editor);
|
||||
}
|
||||
else if (op.compareTo("set") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performSetOperation(filePath, setting, value, editor);
|
||||
}
|
||||
else if (op.compareTo("remove") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performRemoveOperation(filePath, setting, editor);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.err.println("Tool error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Display the usage string if we encountered an error with the
|
||||
// command line arguments.
|
||||
if (argumentsError)
|
||||
System.out.print(usage);
|
||||
|
||||
// Set the exit code appropriatedly
|
||||
if (opPerformed)
|
||||
System.exit(0);
|
||||
else
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
/**
|
||||
*
|
||||
* Interface exported by users of the SettingsFileUtil class.
|
||||
*
|
||||
*/
|
||||
public interface IVerifySetting
|
||||
{
|
||||
/**
|
||||
* Checks if the specified setting is valid.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @return True if the specified setting is valid.
|
||||
*/
|
||||
boolean validSetting(String setting);
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid in conjunction
|
||||
* with the specified value.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @param value The value of the specified setting.
|
||||
* @return The formal name of the setting if found to be valid.
|
||||
*/
|
||||
String validSettingNameAndValue(String setting,
|
||||
String value);
|
||||
}
|
@ -0,0 +1,297 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class for the creation and editing of identtoken.settings files.
|
||||
*
|
||||
**/
|
||||
public class IdenTokenSettingsEditor implements IVerifySetting
|
||||
{
|
||||
private static final String usage =
|
||||
"java identoken_settings_editor -op [settingName [settingValue]] -file settingsFilePath\n\n" +
|
||||
" where:\n" +
|
||||
" -op - Corresponds to one of the following operations:\n" +
|
||||
" -create - Create new identoken settings file\n" +
|
||||
" -list - List settings\n" +
|
||||
" -get - Get settings, must be followed by settingName parameter\n" +
|
||||
" -set - Set settings, must be followed by settingName and settingValue parameters\n" +
|
||||
" -remove - Remove settings\n" +
|
||||
" -file - Path the the identoken settings file\n" +
|
||||
" settingName - Name of the setting being retrieved or set\n" +
|
||||
" settingValue - Value of the setting being set\n\n" +
|
||||
" The following settings are valid:\n" +
|
||||
" Attributes\n";
|
||||
|
||||
private static final String settings =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<settings>\n" +
|
||||
"</settings>\n";
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @return True if the specified setting is valid.
|
||||
*/
|
||||
public boolean validSetting(String setting)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
if (setting.compareToIgnoreCase(IdenTokenConfig.EncryptAttributes) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(IdenTokenConfig.Attributes) == 0)
|
||||
result = true;
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid in conjunction
|
||||
* with the specified value.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @param value The value of the specified setting.
|
||||
* @return The formal name of the setting if found to be valid.
|
||||
*/
|
||||
public String validSettingNameAndValue(String setting,
|
||||
String value)
|
||||
{
|
||||
String validSetting = null;
|
||||
|
||||
if (setting.compareToIgnoreCase(IdenTokenConfig.EncryptAttributes) == 0)
|
||||
{
|
||||
// Always succeed
|
||||
validSetting = IdenTokenConfig.EncryptAttributes;
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(IdenTokenConfig.Attributes) == 0)
|
||||
{
|
||||
// Always succeed
|
||||
validSetting = IdenTokenConfig.Attributes;
|
||||
}
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return validSetting;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Applications Entry Point
|
||||
*
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
String op = null;
|
||||
boolean opPerformed = false;
|
||||
boolean argumentsError = false;
|
||||
String filePath = null;
|
||||
String setting = null;
|
||||
String value = null;
|
||||
identoken_settings_editor editor = new identoken_settings_editor();
|
||||
|
||||
// Process the command line arguments
|
||||
for (int i = 0; i < args.length; i++)
|
||||
{
|
||||
// Proceed based on the command
|
||||
if (args[i].compareToIgnoreCase("-file") == 0)
|
||||
{
|
||||
// The next argument should contain the filepath
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
filePath = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-list") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "list";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-create") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "create";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-get") == 0)
|
||||
{
|
||||
// Get setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "get";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-set") == 0)
|
||||
{
|
||||
// Set setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "set";
|
||||
|
||||
// The next two arguments should contain the setting name
|
||||
// and the setting value.
|
||||
if (args.length > (i + 2))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
value = args[i + 2];
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-remove") == 0)
|
||||
{
|
||||
// Remove setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "remove";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed based on the specified parameters
|
||||
if (argumentsError == false)
|
||||
{
|
||||
if (filePath != null && op != null)
|
||||
{
|
||||
System.out.println("Dealing with settings file: " + filePath);
|
||||
|
||||
// Proceed based on the operation requested
|
||||
if (op.compareTo("list") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performListOperation(filePath);
|
||||
}
|
||||
else if (op.compareTo("create") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performCreateOperation(filePath, settings);
|
||||
}
|
||||
else if (op.compareTo("get") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performGetOperation(filePath, setting, editor);
|
||||
}
|
||||
else if (op.compareTo("set") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performSetOperation(filePath, setting, value, editor);
|
||||
}
|
||||
else if (op.compareTo("remove") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performRemoveOperation(filePath, setting, editor);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.err.println("Tool error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Display the usage string if we encountered an error with the
|
||||
// command line arguments.
|
||||
if (argumentsError)
|
||||
System.out.print(usage);
|
||||
|
||||
// Set the exit code appropriatedly
|
||||
if (opPerformed)
|
||||
System.exit(0);
|
||||
else
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
@ -49,7 +49,13 @@ JAVAFILES = ProtoDefs.java \
|
||||
Krb5Authenticate.java \
|
||||
PwdAuthenticate.java \
|
||||
SessionToken.java \
|
||||
WSSecurity.java
|
||||
WSSecurity.java \
|
||||
AuthPolicyEditor.java \
|
||||
AuthTokenSettingsEditor.java \
|
||||
IdenTokenSettingsEditor.java \
|
||||
IVerifySetting.java \
|
||||
SettingsFileUtil.java \
|
||||
SvcSettingsEditor.java
|
||||
|
||||
EXTRA_DIST = $(JAVAFILES) \
|
||||
Krb5_mechanism.settings \
|
||||
|
@ -0,0 +1,429 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
import org.apache.xerces.parsers.DOMParser;
|
||||
import org.apache.xml.serialize.OutputFormat;
|
||||
import org.apache.xml.serialize.XMLSerializer;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class for the creation and editing of settings files.
|
||||
*
|
||||
**/
|
||||
public class SettingsFileUtil
|
||||
{
|
||||
/**
|
||||
* Gets document for the specified settings file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @return Document representation of the settings file.
|
||||
*/
|
||||
private static Document getSettingsFileDoc(String filePath)
|
||||
{
|
||||
Document doc = null;
|
||||
|
||||
try
|
||||
{
|
||||
// Get an input stream to read from settings file
|
||||
File f = new File(filePath);
|
||||
FileInputStream inStream = new FileInputStream(f);
|
||||
InputSource source = new InputSource(inStream);
|
||||
|
||||
DOMParser parser = new DOMParser();
|
||||
parser.parse(source);
|
||||
doc = parser.getDocument();
|
||||
|
||||
inStream.close();
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
System.err.println("Settings file " + filePath + " not found");
|
||||
doc = null;
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.err.println("SecurityException accessing " + filePath);
|
||||
doc = null;
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.err.println("IOException accessing " + filePath + " Exception=" + e.toString());
|
||||
doc = null;
|
||||
}
|
||||
catch (SAXException e)
|
||||
{
|
||||
System.err.println("Settings file " + filePath + " format error");
|
||||
doc = null;
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a starting settings document
|
||||
*
|
||||
* @param settings String with starting settings document.
|
||||
* @return Starting settings document.
|
||||
*/
|
||||
private static Document getSettingsDoc(String settings)
|
||||
{
|
||||
Document doc = null;
|
||||
|
||||
try
|
||||
{
|
||||
StringReader reader = new StringReader(settings);
|
||||
InputSource source = new InputSource(reader);
|
||||
|
||||
DOMParser parser = new DOMParser();
|
||||
parser.parse(source);
|
||||
doc = parser.getDocument();
|
||||
reader.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
System.err.println("Program error, exception: " + e.toString());
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* List all of the settings present in the specified file.
|
||||
*
|
||||
* @param filePath` Path to the settings file.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
public static boolean performListOperation(String filePath)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// List the settings present in the file
|
||||
Document doc = getSettingsFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Go through the elements of the document
|
||||
Element root = doc.getDocumentElement();
|
||||
Node child;
|
||||
Node next = root.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE)
|
||||
{
|
||||
System.out.println(child.getLocalName() + "=" + child.getTextContent());
|
||||
}
|
||||
}
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create settings file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @param settings String containing an settings document.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
public static boolean performCreateOperation(String filePath,
|
||||
String settings)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// create a settings file
|
||||
Document doc = getSettingsDoc(settings);
|
||||
if (doc != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
File f = new File(filePath);
|
||||
boolean createStatus = f.createNewFile();
|
||||
if (createStatus == true)
|
||||
{
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
OutputFormat format = new OutputFormat(doc);
|
||||
XMLSerializer serializer = new XMLSerializer(out, format);
|
||||
serializer.serialize(doc.getDocumentElement());
|
||||
out.close();
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("File " + filePath + " already exists");
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("Error creating file " + filePath + ", exception: " + e.toString());
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("SecurityException creating " + filePath);
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets value of the specified setting in the specified settings file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @param setting Name of the setting being queried.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
public static boolean performGetOperation(String filePath,
|
||||
String setting,
|
||||
IVerifySetting settingVerifier)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Validate the setting name specified
|
||||
if (settingVerifier.validSetting(setting))
|
||||
{
|
||||
// Get settings present in the file
|
||||
Document doc = getSettingsFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Go through the elements of the document until
|
||||
// we find the one specified.
|
||||
Element root = doc.getDocumentElement();
|
||||
Node child;
|
||||
Node next = root.getFirstChild();
|
||||
boolean settingFound = false;
|
||||
while ((child = next) != null
|
||||
&& settingFound == false)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE
|
||||
&& child.getLocalName().compareToIgnoreCase(setting) == 0)
|
||||
{
|
||||
System.out.println(child.getLocalName() + "=" + child.getTextContent());
|
||||
settingFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingFound == false)
|
||||
System.out.println("Not set");
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the specified setting in the specified settings file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @param setting`` Name of the setting to be set.
|
||||
* @param value Value to be assigned to the setting.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
public static boolean performSetOperation(String filePath,
|
||||
String setting,
|
||||
String value,
|
||||
IVerifySetting settingVerifier)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Validate specified setting name and value
|
||||
String formalSetting;
|
||||
if ((formalSetting = settingVerifier.validSettingNameAndValue(setting, value)) != null)
|
||||
{
|
||||
// Get settings present in the file
|
||||
Document doc = getSettingsFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Go through the elements of the document until
|
||||
// we find the one specified.
|
||||
Element root = doc.getDocumentElement();
|
||||
Node child;
|
||||
Node next = (Node) root.getFirstChild();
|
||||
boolean settingFound = false;
|
||||
while ((child = next) != null
|
||||
&& settingFound == false)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE
|
||||
&& child.getLocalName().compareToIgnoreCase(setting) == 0)
|
||||
{
|
||||
// Change the value of the setting
|
||||
child.setTextContent(value);
|
||||
settingFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingFound == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
Element element = doc.createElement(formalSetting);
|
||||
element.setTextContent(value);
|
||||
root.appendChild(element);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
System.err.println("Exception caught " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
// Update the file after removing the text nodes
|
||||
try
|
||||
{
|
||||
// Remove text nodes
|
||||
next = (Node) root.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.TEXT_NODE)
|
||||
{
|
||||
// Remove the node
|
||||
root.removeChild(child);
|
||||
}
|
||||
}
|
||||
|
||||
// Update file
|
||||
File f = new File(filePath);
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
OutputFormat format = new OutputFormat(doc);
|
||||
XMLSerializer serializer = new XMLSerializer(out, format);
|
||||
serializer.serialize(doc.getDocumentElement());
|
||||
out.close();
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("Error writing to file " + filePath + ", exception: " + e.toString());
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("SecurityException writting to file " + filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove specified setting from the specified settings file.
|
||||
*
|
||||
* @param filePath Path to the settings file.
|
||||
* @param setting Name of the setting to be removed.
|
||||
* @return True if the operation is successfully performed.
|
||||
*/
|
||||
public static boolean performRemoveOperation(String filePath,
|
||||
String setting,
|
||||
IVerifySetting settingVerifier)
|
||||
{
|
||||
boolean opPerformed = false;
|
||||
|
||||
// Validate specified setting name
|
||||
if (settingVerifier.validSetting(setting))
|
||||
{
|
||||
// Get settings present in the file
|
||||
Document doc = getSettingsFileDoc(filePath);
|
||||
if (doc != null)
|
||||
{
|
||||
// Go through the elements of the document until
|
||||
// we find the one specified.
|
||||
Element root = doc.getDocumentElement();
|
||||
Node child;
|
||||
Node next = (Node) root.getFirstChild();
|
||||
boolean settingFound = false;
|
||||
while ((child = next) != null
|
||||
&& settingFound == false)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE
|
||||
&& child.getLocalName().compareToIgnoreCase(setting) == 0)
|
||||
{
|
||||
// Remove the element from the document
|
||||
root.removeChild(child);
|
||||
settingFound = true;
|
||||
|
||||
// Update the file after removing the text nodes
|
||||
try
|
||||
{
|
||||
// Remove text nodes
|
||||
next = (Node) root.getFirstChild();
|
||||
while ((child = next) != null)
|
||||
{
|
||||
next = child.getNextSibling();
|
||||
if (child.getNodeType() == Node.TEXT_NODE)
|
||||
{
|
||||
// Remove the node
|
||||
root.removeChild(child);
|
||||
}
|
||||
}
|
||||
|
||||
// Update file
|
||||
File f = new File(filePath);
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
OutputFormat format = new OutputFormat(doc);
|
||||
XMLSerializer serializer = new XMLSerializer(out, format);
|
||||
serializer.serialize(doc.getDocumentElement());
|
||||
out.close();
|
||||
|
||||
opPerformed = true;
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("Error writing to file " + filePath + ", exception: " + e.toString());
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("SecurityException writting to file " + filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settingFound == false)
|
||||
{
|
||||
// Succeed anyway
|
||||
opPerformed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return opPerformed;
|
||||
}
|
||||
}
|
@ -0,0 +1,374 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* This library 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
|
||||
* Library Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, Novell, Inc.
|
||||
*
|
||||
* To contact Novell about this file by physical or electronic mail,
|
||||
* you may find current contact information at www.novell.com.
|
||||
*
|
||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
package com.novell.casa.authtoksvc;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class for the creation and editing of svc.settings files.
|
||||
*
|
||||
**/
|
||||
public class SvcSettingsEditor implements IVerifySetting
|
||||
{
|
||||
private static final String usage =
|
||||
"java svc_settings_editor -op [settingName [settingValue]] -file settingsFilePath\n\n" +
|
||||
" where:\n" +
|
||||
" -op - Corresponds to one of the following operations:\n" +
|
||||
" -create - Create new svc settings file\n" +
|
||||
" -list - List settings\n" +
|
||||
" -get - Get settings, must be followed by settingName parameter\n" +
|
||||
" -set - Set settings, must be followed by settingName and settingValue parameters\n" +
|
||||
" -remove - Remove settings\n" +
|
||||
" -file - Path the the svc settings file\n" +
|
||||
" settingName - Name of the setting being retrieved or set\n" +
|
||||
" settingValue - Value of the setting being set\n\n" +
|
||||
" The following settings are valid:\n" +
|
||||
" SessionTokenLifetime\n" +
|
||||
" LifetimeShorter\n" +
|
||||
" IAConfigFile\n" +
|
||||
" ReconfigureInterval\n" +
|
||||
" KeyStoreUser\n" +
|
||||
" KeyStorePwd\n";
|
||||
|
||||
private static final String settings =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<settings>\n" +
|
||||
" <IAConfigFile>/etc/CASA/authtoken/svc/iaRealms.xml</IAConfigFile>\n" +
|
||||
"</settings>\n";
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @return True if the specified setting is valid.
|
||||
*/
|
||||
public boolean validSetting(String setting)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
if (setting.compareToIgnoreCase(SvcConfig.SessionTokenLifetime) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.LifetimeShorter) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.IdentityAbstractionConfigFile) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.ReconfigureInterval) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.KeyStoreUser) == 0)
|
||||
result = true;
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.KeyStorePwd) == 0)
|
||||
result = true;
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the specified setting is valid in conjunction
|
||||
* with the specified value.
|
||||
*
|
||||
* @param setting The name of the setting being checked.
|
||||
* @param value The value of the specified setting.
|
||||
* @return The formal name of the setting if found to be valid.
|
||||
*/
|
||||
public String validSettingNameAndValue(String setting,
|
||||
String value)
|
||||
{
|
||||
String validSetting = null;
|
||||
|
||||
if (setting.compareToIgnoreCase(SvcConfig.SessionTokenLifetime) == 0)
|
||||
{
|
||||
// Verify that we are dealing with a numeric value
|
||||
try
|
||||
{
|
||||
Integer.valueOf(value);
|
||||
|
||||
// Good
|
||||
validSetting = SvcConfig.SessionTokenLifetime;
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
System.out.println("Invalid setting value specified");
|
||||
}
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.LifetimeShorter) == 0)
|
||||
{
|
||||
// Verify that we are dealing with a numeric value
|
||||
try
|
||||
{
|
||||
Integer.valueOf(value);
|
||||
|
||||
// Good
|
||||
validSetting = SvcConfig.LifetimeShorter;
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
System.out.println("Invalid setting value specified");
|
||||
}
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.IdentityAbstractionConfigFile) == 0)
|
||||
{
|
||||
// Output a warning if the specified file does not exist
|
||||
try
|
||||
{
|
||||
File f = new File(value);
|
||||
if (f.exists() == false)
|
||||
{
|
||||
System.out.println("Warning: File " + value + " does not exist");
|
||||
}
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
System.out.println("Warning: Not able to access file " + value);
|
||||
}
|
||||
|
||||
// Always succeed
|
||||
validSetting = SvcConfig.IdentityAbstractionConfigFile;
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.ReconfigureInterval) == 0)
|
||||
{
|
||||
// Verify that we are dealing with a numeric value
|
||||
try
|
||||
{
|
||||
Integer.valueOf(value);
|
||||
|
||||
// Good
|
||||
validSetting = SvcConfig.ReconfigureInterval;
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
System.out.println("Invalid setting value specified");
|
||||
}
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.KeyStoreUser) == 0)
|
||||
{
|
||||
validSetting = SvcConfig.KeyStoreUser;
|
||||
}
|
||||
else if (setting.compareToIgnoreCase(SvcConfig.KeyStorePwd) == 0)
|
||||
{
|
||||
validSetting = SvcConfig.KeyStorePwd;
|
||||
}
|
||||
else
|
||||
System.out.println("Invalid setting specified");
|
||||
|
||||
return validSetting;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applications Entry Point
|
||||
*
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
String op = null;
|
||||
boolean opPerformed = false;
|
||||
boolean argumentsError = false;
|
||||
String filePath = null;
|
||||
String setting = null;
|
||||
String value = null;
|
||||
svc_settings_editor editor = new svc_settings_editor();
|
||||
|
||||
// Process the command line arguments
|
||||
for (int i = 0; i < args.length; i++)
|
||||
{
|
||||
// Proceed based on the command
|
||||
if (args[i].compareToIgnoreCase("-file") == 0)
|
||||
{
|
||||
// The next argument should contain the filepath
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
filePath = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-list") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "list";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-create") == 0)
|
||||
{
|
||||
// List operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "create";
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-get") == 0)
|
||||
{
|
||||
// Get setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "get";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-set") == 0)
|
||||
{
|
||||
// Set setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "set";
|
||||
|
||||
// The next two arguments should contain the setting name
|
||||
// and the setting value.
|
||||
if (args.length > (i + 2))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
value = args[i + 2];
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (args[i].compareToIgnoreCase("-remove") == 0)
|
||||
{
|
||||
// Remove setting operation requested
|
||||
if (op == null)
|
||||
{
|
||||
op = "remove";
|
||||
|
||||
// The next argument should contain the setting name
|
||||
if (args.length > (i + 1))
|
||||
{
|
||||
setting = args[i + 1];
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed based on the specified parameters
|
||||
if (argumentsError == false)
|
||||
{
|
||||
if (filePath != null && op != null)
|
||||
{
|
||||
System.out.println("Dealing with settings file: " + filePath);
|
||||
|
||||
// Proceed based on the operation requested
|
||||
if (op.compareTo("list") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performListOperation(filePath);
|
||||
}
|
||||
else if (op.compareTo("create") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performCreateOperation(filePath, settings);
|
||||
}
|
||||
else if (op.compareTo("get") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performGetOperation(filePath, setting, editor);
|
||||
}
|
||||
else if (op.compareTo("set") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performSetOperation(filePath, setting, value, editor);
|
||||
}
|
||||
else if (op.compareTo("remove") == 0)
|
||||
{
|
||||
opPerformed = SettingsFileUtil.performRemoveOperation(filePath, setting, editor);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.err.println("Tool error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
argumentsError = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Display the usage string if we encountered an error with the
|
||||
// command line arguments.
|
||||
if (argumentsError)
|
||||
System.out.print(usage);
|
||||
|
||||
// Set the exit code appropriatedly
|
||||
if (opPerformed)
|
||||
System.exit(0);
|
||||
else
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user