http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/agents-installer/src/main/java/com/xasecure/utils/install/XmlConfigChanger.java ---------------------------------------------------------------------- diff --git a/agents-installer/src/main/java/com/xasecure/utils/install/XmlConfigChanger.java b/agents-installer/src/main/java/com/xasecure/utils/install/XmlConfigChanger.java deleted file mode 100644 index 946ef4f..0000000 --- a/agents-installer/src/main/java/com/xasecure/utils/install/XmlConfigChanger.java +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.xasecure.utils.install; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XmlConfigChanger { - - private static final String EMPTY_TOKEN = "%EMPTY%" ; - private static final String EMPTY_TOKEN_VALUE = "" ; - - public static final String ROOT_NODE_NAME = "configuration" ; - public static final String NAME_NODE_NAME = "name" ; - public static final String PROPERTY_NODE_NAME = "property" ; - public static final String VALUE_NODE_NAME = "value" ; - - private File inpFile ; - private File outFile ; - private File confFile ; - private File propFile ; - - private Document doc ; - - - - public static void main(String[] args) { - XmlConfigChanger xmlConfigChanger = new XmlConfigChanger() ; - xmlConfigChanger.parseConfig(args); - try { - xmlConfigChanger.run(); - } - catch(Throwable t) { - System.err.println("*************************************************************************") ; - System.err.println("******* ERROR: unable to process xml configuration changes due to error:" + t.getMessage()) ; - t.printStackTrace(); - System.err.println("*************************************************************************") ; - System.exit(1); - } - } - - - - - @SuppressWarnings("static-access") - public void parseConfig(String[] args) { - - - Options options = new Options(); - - Option inputOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("input").withDescription("Input xml file name").create('i'); - options.addOption(inputOption); - - Option outputOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("output").withDescription("Output xml file name").create('o'); - options.addOption(outputOption); - - Option configOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("config").withDescription("Config file name").create('c'); - options.addOption(configOption); - - Option installPropOption = OptionBuilder.hasArgs(1).isRequired(false).withLongOpt("installprop").withDescription("install.properties").create('p'); - options.addOption(installPropOption); - - CommandLineParser parser = new BasicParser(); - CommandLine cmd = null ; - try { - cmd = parser.parse(options, args); - } catch (ParseException e) { - String header = "ERROR: " + e ; - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); - System.exit(1); - } - - String inputFileName = cmd.getOptionValue('i') ; - this.inpFile = new File(inputFileName) ; - if (! this.inpFile.canRead()) { - String header = "ERROR: Input file [" + this.inpFile.getAbsolutePath() + "] can not be read."; - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); - System.exit(1); - } - - String outputFileName = cmd.getOptionValue('o') ; - this.outFile = new File(outputFileName) ; - if (this.outFile.exists()) { - String header = "ERROR: Output file [" + this.outFile.getAbsolutePath() + "] already exists. Specify a filepath for creating new output file for the input [" + this.inpFile.getAbsolutePath() + "]"; - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); - System.exit(1); - } - - String configFileName = cmd.getOptionValue('c') ; - this.confFile = new File(configFileName) ; - if (! this.confFile.canRead()) { - String header = "ERROR: Config file [" + this.confFile.getAbsolutePath() + "] can not be read."; - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); - System.exit(1); - } - - String installPropFileName = (cmd.hasOption('p') ? cmd.getOptionValue('p') : null ) ; - if (installPropFileName != null) { - this.propFile = new File(installPropFileName) ; - if (! this.propFile.canRead()) { - String header = "ERROR: Install Property file [" + this.propFile.getAbsolutePath() + "] can not be read."; - HelpFormatter helpFormatter = new HelpFormatter(); - helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); - System.exit(1); - } - } - - } - - - - - public void run() throws ParserConfigurationException, SAXException, IOException, TransformerException { - - - loadInstallProperties() ; - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ; - DocumentBuilder builder = factory.newDocumentBuilder() ; - doc = builder.parse(inpFile) ; - - BufferedReader reader = null ; - try { - reader = new BufferedReader(new FileReader(confFile)) ; - - String line = null ; - - @SuppressWarnings("unused") - int lineNo = 0 ; - - while ((line = reader.readLine()) != null) { - - lineNo++ ; - - line = line.trim() ; - - if (line.isEmpty() ) - continue ; - if (line.startsWith("#")) { - continue ; - } - - if (line.contains("#")) { - int len = line.indexOf("#") ; - line = line.substring(0,len) ; - } - - String[] tokens = line.split("\\s+") ; - - String propName = tokens[0] ; - - String propValue = null ; - - try { - propValue = replaceProp(tokens[1],installProperties) ; - } catch (ValidationException e) { - // throw new RuntimeException("Unable to replace tokens in the line: \n[" + line + "]\n in file [" + confFile.getAbsolutePath() + "] line number:[" + lineNo + "]" ) ; - throw new RuntimeException(e) ; - } - - - - String actionType = tokens[2] ; - String options = (tokens.length > 3 ? tokens[3] : null) ; - boolean createIfNotExists = (options != null && options.contains("create-if-not-exists")) ; - - - if ("add".equals(actionType)) { - addProperty(propName, propValue); - } - else if ("mod".equals(actionType)) { - modProperty(propName, propValue,createIfNotExists); - } - else if ("del".equals(actionType)) { - delProperty(propName); - } - else if ("append".equals(actionType)) { - String curVal = getProperty(propName) ; - if (curVal == null) { - if (createIfNotExists) { - addProperty(propName, propValue); - } - } - else { - String appendDelimitor = (tokens.length > 4 ? tokens[4] : " ") ; - if (! curVal.contains(propValue)) { - String newVal = null ; - if (curVal.length() == 0) { - newVal = propValue ; - } - else { - newVal = curVal + appendDelimitor + propValue ; - } - modProperty(propName, newVal,createIfNotExists) ; - } - } - } - else if ("delval".equals(actionType)) { - String curVal = getProperty(propName) ; - if (curVal != null) { - String appendDelimitor = (tokens.length > 4 ? tokens[4] : " ") ; - if (curVal.contains(propValue)) { - String[] valTokens = curVal.split(appendDelimitor) ; - StringBuilder sb = new StringBuilder() ; - for(String v : valTokens) { - if (! v.equals(propValue)) { - if (sb.length() > 0) { - sb.append(appendDelimitor) ; - } - sb.append(v); - } - } - String newVal = sb.toString() ; - modProperty(propName, newVal,createIfNotExists) ; - } - } - } - else { - throw new RuntimeException("Unknown Command Found: [" + actionType + "], Supported Types: add modify del append") ; - } - - } - - TransformerFactory tfactory = TransformerFactory.newInstance() ; - Transformer transformer = tfactory.newTransformer() ; - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); - - DOMSource source = new DOMSource(doc) ; - FileOutputStream out = new FileOutputStream(outFile) ; - StreamResult result = new StreamResult(out) ; - transformer.transform(source, result); - out.close(); - - } - finally { - if (reader != null) { - reader.close(); - } - } - - } - - - private void addProperty(String propName, String val) { - NodeList nl = doc.getElementsByTagName(ROOT_NODE_NAME) ; - Node rootConfig = nl.item(0) ; - rootConfig.appendChild(createNewElement(propName,val)) ; - } - - private void modProperty(String propName, String val, boolean createIfNotExists) { - Node node = findProperty(propName) ; - if (node != null) { - NodeList cnl = node.getChildNodes() ; - for (int j = 0 ; j < cnl.getLength() ; j++) { - String nodeName = cnl.item(j).getNodeName() ; - if (nodeName.equals(VALUE_NODE_NAME)) { - if (cnl.item(j).hasChildNodes()) { - cnl.item(j).getChildNodes().item(0).setNodeValue(val); - } - else { - Node propValueNode = cnl.item(j) ; - Node txtNode = doc.createTextNode(val) ; - propValueNode.appendChild(txtNode) ; - txtNode.setNodeValue(val); - } - return ; - } - } - } - if (createIfNotExists) { - addProperty(propName, val); - } - } - - private String getProperty(String propName) { - String ret = null; - try { - Node node = findProperty(propName) ; - if (node != null) { - NodeList cnl = node.getChildNodes() ; - for (int j = 0 ; j < cnl.getLength() ; j++) { - String nodeName = cnl.item(j).getNodeName() ; - if (nodeName.equals(VALUE_NODE_NAME)) { - Node valueNode = null ; - if (cnl.item(j).hasChildNodes()) { - valueNode = cnl.item(j).getChildNodes().item(0) ; - } - if (valueNode == null) { // Value Node is defined with - ret = "" ; - } - else { - ret = valueNode.getNodeValue() ; - } - break ; - } - } - } - } - catch(Throwable t) { - throw new RuntimeException("getProperty(" + propName + ") failed.", t) ; - } - return ret ; - } - - - private void delProperty(String propName) { - Node node = findProperty(propName) ; - if (node != null) { - node.getParentNode().removeChild(node) ; - } - } - - - private Node findProperty(String propName) { - Node ret = null; - try { - NodeList nl = doc.getElementsByTagName(PROPERTY_NODE_NAME) ; - - for(int i = 0 ; i < nl.getLength() ; i++) { - NodeList cnl = nl.item(i).getChildNodes(); - boolean found = false ; - for (int j = 0 ; j < cnl.getLength() ; j++) { - String nodeName = cnl.item(j).getNodeName() ; - if (nodeName.equals(NAME_NODE_NAME)) { - String pName = cnl.item(j).getChildNodes().item(0).getNodeValue() ; - found = pName.equals(propName) ; - if (found) - break ; - } - } - if (found) { - ret = nl.item(i) ; - break; - } - } - } - catch(Throwable t) { - throw new RuntimeException("findProperty(" + propName + ") failed.", t) ; - } - return ret ; - } - - - private Element createNewElement(String propName, String val) { - Element ret = null ; - - try { - if (doc != null) { - ret = doc.createElement(PROPERTY_NODE_NAME) ; - Node propNameNode = doc.createElement(NAME_NODE_NAME) ; - Node txtNode = doc.createTextNode(propName) ; - propNameNode.appendChild(txtNode) ; - propNameNode.setNodeValue(propName); - ret.appendChild(propNameNode); - - Node propValueNode = doc.createElement(VALUE_NODE_NAME) ; - txtNode = doc.createTextNode(val) ; - propValueNode.appendChild(txtNode) ; - propValueNode.setNodeValue(propName); - ret.appendChild(propValueNode); - } - } - catch(Throwable t) { - throw new RuntimeException("createNewElement(" + propName + ") with value [" + val + "] failed.", t) ; - } - - - return ret ; - } - - - Properties installProperties = new Properties() ; - - private void loadInstallProperties() throws IOException { - if (propFile != null) { - FileInputStream in = new FileInputStream(propFile) ; - installProperties.load(in); - } - // To support environment variable, we will add all environment variables to the Properties - installProperties.putAll(System.getenv()); - } - - - private String replaceProp(String propValue, Properties prop) throws ValidationException { - - StringBuilder tokensb = new StringBuilder() ; - StringBuilder retsb = new StringBuilder() ; - boolean isToken = false ; - - for(char c : propValue.toCharArray()) { - if (c == '%') { - if (isToken) { - String token = tokensb.toString(); - String tokenValue = (token.length() == 0 ? "%" : prop.getProperty(token) ) ; - if (tokenValue == null || tokenValue.trim().isEmpty()) { - throw new ValidationException("ERROR: configuration token [" + token + "] is not defined in the file: [" + (propFile != null ? propFile.getAbsolutePath() : "{no install.properties file specified using -p option}") + "]") ; - } - else { - if (EMPTY_TOKEN.equals(tokenValue)) { - retsb.append(EMPTY_TOKEN_VALUE) ; - } - else { - retsb.append(tokenValue) ; - } - } - isToken = false; - } - else { - isToken = true ; - tokensb.setLength(0); - } - } - else if (isToken) { - tokensb.append(String.valueOf(c)) ; - } - else { - retsb.append(String.valueOf(c)) ; - } - } - - if (isToken) { - throw new ValidationException("ERROR: configuration has a token defined without end-token [" + propValue + "] in the file: [" + (propFile != null ? propFile.getAbsolutePath() : "{no install.properties file specified using -p option}") + "]") ; - } - - return retsb.toString(); - } - - - @SuppressWarnings("serial") - class ValidationException extends Exception { - - public ValidationException(String msg) { - super(msg); - } - - public ValidationException(Throwable cause) { - super(cause); - } - - } - - -}
http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/agents-installer/src/main/java/org/apache/ranger/utils/install/PasswordGenerator.java ---------------------------------------------------------------------- diff --git a/agents-installer/src/main/java/org/apache/ranger/utils/install/PasswordGenerator.java b/agents-installer/src/main/java/org/apache/ranger/utils/install/PasswordGenerator.java new file mode 100644 index 0000000..3632c1a --- /dev/null +++ b/agents-installer/src/main/java/org/apache/ranger/utils/install/PasswordGenerator.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.ranger.utils.install; + +import java.util.ArrayList; +import java.util.Random; + +public class PasswordGenerator { + + + private int minimumPasswordLength = 8 ; + + private int maximumPasswordLength = 12 ; + + private boolean isExpectedNumberic = true ; + + private boolean isExpectedBothCase = true ; + + private static final ArrayList<Character> alphaLetters = new ArrayList<Character>() ; + + private static final ArrayList<Character> alphaUpperLetters = new ArrayList<Character>() ; + + private static final ArrayList<Character> numericLetters = new ArrayList<Character>() ; + + + static { + for(int x = 'a' ; x <= 'z' ; x++) { + char v = (char)x ; + alphaLetters.add(Character.toLowerCase(v)) ; + alphaUpperLetters.add(Character.toUpperCase(v)) ; + } + for(int i = 0 ; i < 10 ; i++) { + numericLetters.add(Character.forDigit(i,10)) ; + } + } + + + + public static void main(String[] args) { + PasswordGenerator pg = new PasswordGenerator() ; + System.out.println(pg.generatorPassword()) ; + } + + + private int getPasswordLength() { + int ret = 0; + + if (minimumPasswordLength == maximumPasswordLength) { + ret = minimumPasswordLength ; + } + else { + + int diff = Math.abs(maximumPasswordLength - minimumPasswordLength) + 1 ; + ret = minimumPasswordLength + new Random().nextInt(diff) ; + } + return (ret) ; + } + + + public String generatorPassword() { + + String password = null ; + + ArrayList<Character> all = new ArrayList<Character>() ; + + all.addAll(alphaLetters) ; + all.addAll(alphaUpperLetters) ; + all.addAll(numericLetters) ; + + int len = getPasswordLength() ; + + Random random = new Random() ; + + int setSz = all.size(); + + do + { + StringBuilder sb = new StringBuilder(); + + for(int i = 0 ; i < len ; i++) { + int index = random.nextInt(setSz) ; + Character c = all.get(index) ; + while ((i == 0) && Character.isDigit(c)) { + index = random.nextInt(setSz) ; + c = all.get(index) ; + } + sb.append(all.get(index)) ; + } + password = sb.toString() ; + } while (! isValidPassword(password)) ; + + + return password ; + + } + + private boolean isValidPassword(String pass) { + boolean ret = true ; + + if (isExpectedNumberic || isExpectedBothCase) { + boolean lowerCaseFound = false ; + boolean digitFound = false ; + boolean upperCaseFound = false ; + for(char c : pass.toCharArray()) { + if (!digitFound && Character.isDigit(c)) { + digitFound = true ; + } + else if (!lowerCaseFound && Character.isLowerCase(c)) { + lowerCaseFound = true ; + } + else if (!upperCaseFound && Character.isUpperCase(c) ) { + upperCaseFound = true ; + } + } + + if (isExpectedNumberic && !digitFound) { + ret = false ; + } + + if (isExpectedBothCase && (!lowerCaseFound || !upperCaseFound)) { + ret = false ; + } + } + + return ret ; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/agents-installer/src/main/java/org/apache/ranger/utils/install/XmlConfigChanger.java ---------------------------------------------------------------------- diff --git a/agents-installer/src/main/java/org/apache/ranger/utils/install/XmlConfigChanger.java b/agents-installer/src/main/java/org/apache/ranger/utils/install/XmlConfigChanger.java new file mode 100644 index 0000000..9c5fb6f --- /dev/null +++ b/agents-installer/src/main/java/org/apache/ranger/utils/install/XmlConfigChanger.java @@ -0,0 +1,494 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ranger.utils.install; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.cli.BasicParser; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.OptionBuilder; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class XmlConfigChanger { + + private static final String EMPTY_TOKEN = "%EMPTY%" ; + private static final String EMPTY_TOKEN_VALUE = "" ; + + public static final String ROOT_NODE_NAME = "configuration" ; + public static final String NAME_NODE_NAME = "name" ; + public static final String PROPERTY_NODE_NAME = "property" ; + public static final String VALUE_NODE_NAME = "value" ; + + private File inpFile ; + private File outFile ; + private File confFile ; + private File propFile ; + + private Document doc ; + + + + public static void main(String[] args) { + XmlConfigChanger xmlConfigChanger = new XmlConfigChanger() ; + xmlConfigChanger.parseConfig(args); + try { + xmlConfigChanger.run(); + } + catch(Throwable t) { + System.err.println("*************************************************************************") ; + System.err.println("******* ERROR: unable to process xml configuration changes due to error:" + t.getMessage()) ; + t.printStackTrace(); + System.err.println("*************************************************************************") ; + System.exit(1); + } + } + + + + + @SuppressWarnings("static-access") + public void parseConfig(String[] args) { + + + Options options = new Options(); + + Option inputOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("input").withDescription("Input xml file name").create('i'); + options.addOption(inputOption); + + Option outputOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("output").withDescription("Output xml file name").create('o'); + options.addOption(outputOption); + + Option configOption = OptionBuilder.hasArgs(1).isRequired().withLongOpt("config").withDescription("Config file name").create('c'); + options.addOption(configOption); + + Option installPropOption = OptionBuilder.hasArgs(1).isRequired(false).withLongOpt("installprop").withDescription("install.properties").create('p'); + options.addOption(installPropOption); + + CommandLineParser parser = new BasicParser(); + CommandLine cmd = null ; + try { + cmd = parser.parse(options, args); + } catch (ParseException e) { + String header = "ERROR: " + e ; + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); + System.exit(1); + } + + String inputFileName = cmd.getOptionValue('i') ; + this.inpFile = new File(inputFileName) ; + if (! this.inpFile.canRead()) { + String header = "ERROR: Input file [" + this.inpFile.getAbsolutePath() + "] can not be read."; + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); + System.exit(1); + } + + String outputFileName = cmd.getOptionValue('o') ; + this.outFile = new File(outputFileName) ; + if (this.outFile.exists()) { + String header = "ERROR: Output file [" + this.outFile.getAbsolutePath() + "] already exists. Specify a filepath for creating new output file for the input [" + this.inpFile.getAbsolutePath() + "]"; + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); + System.exit(1); + } + + String configFileName = cmd.getOptionValue('c') ; + this.confFile = new File(configFileName) ; + if (! this.confFile.canRead()) { + String header = "ERROR: Config file [" + this.confFile.getAbsolutePath() + "] can not be read."; + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); + System.exit(1); + } + + String installPropFileName = (cmd.hasOption('p') ? cmd.getOptionValue('p') : null ) ; + if (installPropFileName != null) { + this.propFile = new File(installPropFileName) ; + if (! this.propFile.canRead()) { + String header = "ERROR: Install Property file [" + this.propFile.getAbsolutePath() + "] can not be read."; + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.printHelp("java " + XmlConfigChanger.class.getName(), header, options, null, true); + System.exit(1); + } + } + + } + + + + + public void run() throws ParserConfigurationException, SAXException, IOException, TransformerException { + + + loadInstallProperties() ; + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ; + DocumentBuilder builder = factory.newDocumentBuilder() ; + doc = builder.parse(inpFile) ; + + BufferedReader reader = null ; + try { + reader = new BufferedReader(new FileReader(confFile)) ; + + String line = null ; + + @SuppressWarnings("unused") + int lineNo = 0 ; + + while ((line = reader.readLine()) != null) { + + lineNo++ ; + + line = line.trim() ; + + if (line.isEmpty() ) + continue ; + if (line.startsWith("#")) { + continue ; + } + + if (line.contains("#")) { + int len = line.indexOf("#") ; + line = line.substring(0,len) ; + } + + String[] tokens = line.split("\\s+") ; + + String propName = tokens[0] ; + + String propValue = null ; + + try { + propValue = replaceProp(tokens[1],installProperties) ; + } catch (ValidationException e) { + // throw new RuntimeException("Unable to replace tokens in the line: \n[" + line + "]\n in file [" + confFile.getAbsolutePath() + "] line number:[" + lineNo + "]" ) ; + throw new RuntimeException(e) ; + } + + + + String actionType = tokens[2] ; + String options = (tokens.length > 3 ? tokens[3] : null) ; + boolean createIfNotExists = (options != null && options.contains("create-if-not-exists")) ; + + + if ("add".equals(actionType)) { + addProperty(propName, propValue); + } + else if ("mod".equals(actionType)) { + modProperty(propName, propValue,createIfNotExists); + } + else if ("del".equals(actionType)) { + delProperty(propName); + } + else if ("append".equals(actionType)) { + String curVal = getProperty(propName) ; + if (curVal == null) { + if (createIfNotExists) { + addProperty(propName, propValue); + } + } + else { + String appendDelimitor = (tokens.length > 4 ? tokens[4] : " ") ; + if (! curVal.contains(propValue)) { + String newVal = null ; + if (curVal.length() == 0) { + newVal = propValue ; + } + else { + newVal = curVal + appendDelimitor + propValue ; + } + modProperty(propName, newVal,createIfNotExists) ; + } + } + } + else if ("delval".equals(actionType)) { + String curVal = getProperty(propName) ; + if (curVal != null) { + String appendDelimitor = (tokens.length > 4 ? tokens[4] : " ") ; + if (curVal.contains(propValue)) { + String[] valTokens = curVal.split(appendDelimitor) ; + StringBuilder sb = new StringBuilder() ; + for(String v : valTokens) { + if (! v.equals(propValue)) { + if (sb.length() > 0) { + sb.append(appendDelimitor) ; + } + sb.append(v); + } + } + String newVal = sb.toString() ; + modProperty(propName, newVal,createIfNotExists) ; + } + } + } + else { + throw new RuntimeException("Unknown Command Found: [" + actionType + "], Supported Types: add modify del append") ; + } + + } + + TransformerFactory tfactory = TransformerFactory.newInstance() ; + Transformer transformer = tfactory.newTransformer() ; + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + + DOMSource source = new DOMSource(doc) ; + FileOutputStream out = new FileOutputStream(outFile) ; + StreamResult result = new StreamResult(out) ; + transformer.transform(source, result); + out.close(); + + } + finally { + if (reader != null) { + reader.close(); + } + } + + } + + + private void addProperty(String propName, String val) { + NodeList nl = doc.getElementsByTagName(ROOT_NODE_NAME) ; + Node rootConfig = nl.item(0) ; + rootConfig.appendChild(createNewElement(propName,val)) ; + } + + private void modProperty(String propName, String val, boolean createIfNotExists) { + Node node = findProperty(propName) ; + if (node != null) { + NodeList cnl = node.getChildNodes() ; + for (int j = 0 ; j < cnl.getLength() ; j++) { + String nodeName = cnl.item(j).getNodeName() ; + if (nodeName.equals(VALUE_NODE_NAME)) { + if (cnl.item(j).hasChildNodes()) { + cnl.item(j).getChildNodes().item(0).setNodeValue(val); + } + else { + Node propValueNode = cnl.item(j) ; + Node txtNode = doc.createTextNode(val) ; + propValueNode.appendChild(txtNode) ; + txtNode.setNodeValue(val); + } + return ; + } + } + } + if (createIfNotExists) { + addProperty(propName, val); + } + } + + private String getProperty(String propName) { + String ret = null; + try { + Node node = findProperty(propName) ; + if (node != null) { + NodeList cnl = node.getChildNodes() ; + for (int j = 0 ; j < cnl.getLength() ; j++) { + String nodeName = cnl.item(j).getNodeName() ; + if (nodeName.equals(VALUE_NODE_NAME)) { + Node valueNode = null ; + if (cnl.item(j).hasChildNodes()) { + valueNode = cnl.item(j).getChildNodes().item(0) ; + } + if (valueNode == null) { // Value Node is defined with + ret = "" ; + } + else { + ret = valueNode.getNodeValue() ; + } + break ; + } + } + } + } + catch(Throwable t) { + throw new RuntimeException("getProperty(" + propName + ") failed.", t) ; + } + return ret ; + } + + + private void delProperty(String propName) { + Node node = findProperty(propName) ; + if (node != null) { + node.getParentNode().removeChild(node) ; + } + } + + + private Node findProperty(String propName) { + Node ret = null; + try { + NodeList nl = doc.getElementsByTagName(PROPERTY_NODE_NAME) ; + + for(int i = 0 ; i < nl.getLength() ; i++) { + NodeList cnl = nl.item(i).getChildNodes(); + boolean found = false ; + for (int j = 0 ; j < cnl.getLength() ; j++) { + String nodeName = cnl.item(j).getNodeName() ; + if (nodeName.equals(NAME_NODE_NAME)) { + String pName = cnl.item(j).getChildNodes().item(0).getNodeValue() ; + found = pName.equals(propName) ; + if (found) + break ; + } + } + if (found) { + ret = nl.item(i) ; + break; + } + } + } + catch(Throwable t) { + throw new RuntimeException("findProperty(" + propName + ") failed.", t) ; + } + return ret ; + } + + + private Element createNewElement(String propName, String val) { + Element ret = null ; + + try { + if (doc != null) { + ret = doc.createElement(PROPERTY_NODE_NAME) ; + Node propNameNode = doc.createElement(NAME_NODE_NAME) ; + Node txtNode = doc.createTextNode(propName) ; + propNameNode.appendChild(txtNode) ; + propNameNode.setNodeValue(propName); + ret.appendChild(propNameNode); + + Node propValueNode = doc.createElement(VALUE_NODE_NAME) ; + txtNode = doc.createTextNode(val) ; + propValueNode.appendChild(txtNode) ; + propValueNode.setNodeValue(propName); + ret.appendChild(propValueNode); + } + } + catch(Throwable t) { + throw new RuntimeException("createNewElement(" + propName + ") with value [" + val + "] failed.", t) ; + } + + + return ret ; + } + + + Properties installProperties = new Properties() ; + + private void loadInstallProperties() throws IOException { + if (propFile != null) { + FileInputStream in = new FileInputStream(propFile) ; + installProperties.load(in); + } + // To support environment variable, we will add all environment variables to the Properties + installProperties.putAll(System.getenv()); + } + + + private String replaceProp(String propValue, Properties prop) throws ValidationException { + + StringBuilder tokensb = new StringBuilder() ; + StringBuilder retsb = new StringBuilder() ; + boolean isToken = false ; + + for(char c : propValue.toCharArray()) { + if (c == '%') { + if (isToken) { + String token = tokensb.toString(); + String tokenValue = (token.length() == 0 ? "%" : prop.getProperty(token) ) ; + if (tokenValue == null || tokenValue.trim().isEmpty()) { + throw new ValidationException("ERROR: configuration token [" + token + "] is not defined in the file: [" + (propFile != null ? propFile.getAbsolutePath() : "{no install.properties file specified using -p option}") + "]") ; + } + else { + if (EMPTY_TOKEN.equals(tokenValue)) { + retsb.append(EMPTY_TOKEN_VALUE) ; + } + else { + retsb.append(tokenValue) ; + } + } + isToken = false; + } + else { + isToken = true ; + tokensb.setLength(0); + } + } + else if (isToken) { + tokensb.append(String.valueOf(c)) ; + } + else { + retsb.append(String.valueOf(c)) ; + } + } + + if (isToken) { + throw new ValidationException("ERROR: configuration has a token defined without end-token [" + propValue + "] in the file: [" + (propFile != null ? propFile.getAbsolutePath() : "{no install.properties file specified using -p option}") + "]") ; + } + + return retsb.toString(); + } + + + @SuppressWarnings("serial") + class ValidationException extends Exception { + + public ValidationException(String msg) { + super(msg); + } + + public ValidationException(Throwable cause) { + super(cause); + } + + } + + +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/.gitignore ---------------------------------------------------------------------- diff --git a/credentialbuilder/.gitignore b/credentialbuilder/.gitignore index 0f63015..de3a426 100644 --- a/credentialbuilder/.gitignore +++ b/credentialbuilder/.gitignore @@ -1,2 +1,3 @@ /target/ /bin/ +/bin/ http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/main/java/com/hortonworks/credentialapi/CredentialReader.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/main/java/com/hortonworks/credentialapi/CredentialReader.java b/credentialbuilder/src/main/java/com/hortonworks/credentialapi/CredentialReader.java deleted file mode 100644 index f0627ae..0000000 --- a/credentialbuilder/src/main/java/com/hortonworks/credentialapi/CredentialReader.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.hortonworks.credentialapi; -import java.util.ArrayList; -import java.util.List; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.security.alias.CredentialProvider; -import org.apache.hadoop.security.alias.CredentialProviderFactory; -import org.apache.hadoop.security.alias.JavaKeyStoreProvider; - -public class CredentialReader { - - public static String getDecryptedString(String CrendentialProviderPath,String alias) { - String credential=null; - try{ - if(CrendentialProviderPath==null || alias==null){ - return null; - } - char[] pass = null; - Configuration conf = new Configuration(); - String crendentialProviderPrefix=JavaKeyStoreProvider.SCHEME_NAME + "://file"; - crendentialProviderPrefix=crendentialProviderPrefix.toLowerCase(); - CrendentialProviderPath=CrendentialProviderPath.trim(); - alias=alias.trim(); - if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefix)){ - conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, - //UserProvider.SCHEME_NAME + ":///," + - CrendentialProviderPath); - }else{ - if(CrendentialProviderPath.startsWith("/")){ - conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, - //UserProvider.SCHEME_NAME + ":///," + - JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath); - }else{ - conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, - //UserProvider.SCHEME_NAME + ":///," + - JavaKeyStoreProvider.SCHEME_NAME + "://file/" + CrendentialProviderPath); - } - } - List<CredentialProvider> providers = CredentialProviderFactory.getProviders(conf); - List<String> aliasesList=new ArrayList<String>(); - CredentialProvider.CredentialEntry credEntry=null; - for(CredentialProvider provider: providers) { - //System.out.println("Credential Provider :" + provider); - aliasesList=provider.getAliases(); - if(aliasesList!=null && aliasesList.contains(alias.toLowerCase())){ - credEntry=null; - credEntry= provider.getCredentialEntry(alias); - pass = credEntry.getCredential(); - if(pass!=null && pass.length>0){ - credential=String.valueOf(pass); - break; - } - } - } - }catch(Exception ex){ - ex.printStackTrace(); - credential=null; - } - return credential; - } - - /* - public static void main(String args[]) throws Exception{ - String keystoreFile =new String("/tmp/mykey3.jceks"); - String password=CredentialReader.getDecryptedString(keystoreFile, "mykey3"); - System.out.println(password); - }*/ -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/main/java/com/hortonworks/credentialapi/buildks.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/main/java/com/hortonworks/credentialapi/buildks.java b/credentialbuilder/src/main/java/com/hortonworks/credentialapi/buildks.java deleted file mode 100644 index 717fba2..0000000 --- a/credentialbuilder/src/main/java/com/hortonworks/credentialapi/buildks.java +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.hortonworks.credentialapi; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.security.alias.CredentialShell; -import org.apache.hadoop.util.GenericOptionsParser; - -public class buildks { - public static void main(String[] args) { - buildks buildksOBJ=new buildks(); - String command=null; - try{ - if(args!=null && args.length>=3){ - command=args[0]; - if(command!=null && !command.trim().isEmpty()){ - if(command.equalsIgnoreCase("create")){ - buildksOBJ.createCredential(args); - }else if(command.equalsIgnoreCase("list")){ - buildksOBJ.listCredential(args); - }else if(command.equalsIgnoreCase("get")){ - String credential=buildksOBJ.getCredential(args); - if(credential!=null){ - System.out.println(credential); - System.exit(0); - }else{ - System.exit(1); - } - }else{ - System.out.println(command +" is not supported in current version of CredentialBuilder API."); - System.exit(1); - } - } - }else{ - System.out.println("Invalid Command line argument."); - System.exit(1); - } - }catch(Exception ex){ - ex.printStackTrace(); - System.exit(1); - } - } - - public int createCredential(String args[]){ - int returnCode=-1; - String command=null; - String alias=null; - String valueOption=null; - String credential=null; - String providerOption=null; - String providerPath=null; - String tempCredential=null; - try{ - if(args!=null && args.length==6) - { - command=args[0]; - alias=args[1]; - valueOption=args[2]; - credential=args[3]; - providerOption=args[4]; - providerPath=args[5]; - if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ - return returnCode; - } - tempCredential=CredentialReader.getDecryptedString(providerPath, alias); - }else{ - return returnCode; - } - - if(tempCredential==null){ - returnCode=createKeyStore(args); - }else{ - try{ - System.out.println("Alias already exist!! will try to delete first."); - String argsDelete[]=new String[4]; - argsDelete[0]="delete"; - argsDelete[1]=alias; - argsDelete[2]=providerOption; - argsDelete[3]=providerPath; - returnCode=deleteCredential(argsDelete); - if(returnCode==0){ - returnCode=createKeyStore(args); - } - }catch(Exception ex){ - returnCode=-1; - } - } - }catch(Exception ex){ - ex.printStackTrace(); - } - return returnCode; - } - - public int createKeyStore(String args[]){ - int returnCode=-1; - try{ - String command=null; - String alias=null; - String valueOption=null; - String credential=null; - String providerOption=null; - String providerPath=null; - if(args!=null && args.length==6) - { - command=args[0]; - alias=args[1]; - valueOption=args[2]; - credential=args[3]; - providerOption=args[4]; - providerPath=args[5]; - if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ - return returnCode; - } - displayCommand(args); - }else{ - return returnCode; - } - - CredentialShell cs = new CredentialShell(); - Configuration conf = new Configuration(); - //parse argument - GenericOptionsParser parser = new GenericOptionsParser(conf, args); - //set the configuration back, so that Tool can configure itself - cs.setConf(conf); - //get valid and remaining argument - String[] toolArgs = parser.getRemainingArgs(); - //execute command in CredentialShell - // int i = 0 ; - // for(String s : toolArgs) { - // System.out.println("TooArgs [" + i + "] = [" + s + "]") ; - // i++ ; - // } - returnCode= cs.run(toolArgs); - //if response code is zero then success else failure - //System.out.println("Response Code:"+returnCode); - }catch(IOException ex){ - ex.printStackTrace(); - } catch(Exception ex){ - ex.printStackTrace(); - } - return returnCode; - } - public int createCredentialFromUserInput(){ - int returnCode=-1; - try{ - String[] args=null; - String command=null; - String alias=null; - String valueOption=null; - String credential=null; - String providerOption=null; - String providerPath=null; - //below code can ask user to input if command line input fails - System.out.println("Enter Alias Name:"); - BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in)); - alias = bufferRead.readLine(); - System.out.println("Enter password:"); - credential = bufferRead.readLine(); - System.out.println("Enter .jceks output file name with path:"); - providerPath = bufferRead.readLine(); - if(providerPath!=null && !providerPath.trim().isEmpty() && !providerPath.startsWith("jceks://file")) - { - if(providerPath.startsWith("/")){ - providerPath="jceks://file"+providerPath; - }else{ - providerPath="jceks://file/"+providerPath; - } - } - command="create"; - valueOption="-value"; - providerOption="-provider"; - if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ - return returnCode; - } - args=new String[6]; - args[0]=command; - args[1]=alias; - args[2]=valueOption; - args[3]=credential; - args[4]=providerOption; - args[5]=providerPath; - CredentialShell cs = new CredentialShell(); - Configuration conf = new Configuration(); - //parse argument - GenericOptionsParser parser = new GenericOptionsParser(conf, args); - //set the configuration back, so that Tool can configure itself - cs.setConf(conf); - //get valid and remaining argument - String[] toolArgs = parser.getRemainingArgs(); - //execute command in CredentialShell - returnCode= cs.run(toolArgs); - //if response code is zero then success else failure - //System.out.println("Response Code:"+returnCode); - }catch(IOException ex){ - ex.printStackTrace(); - } catch(Exception ex){ - ex.printStackTrace(); - } - return returnCode; - } - - public int listCredential(String args[]){ - int returnCode=-1; - try{ - if(args!=null && args.length==3) - { - //display command which need to be executed or entered - displayCommand(args); - }else{ - return returnCode; - } - CredentialShell cs = new CredentialShell(); - Configuration conf = new Configuration(); - //parse argument - GenericOptionsParser parser = new GenericOptionsParser(conf, args); - //set the configuration back, so that Tool can configure itself - cs.setConf(conf); - //get valid and remaining argument - String[] toolArgs = parser.getRemainingArgs(); - //execute command in CredentialShell - returnCode= cs.run(toolArgs); - //if response code is zero then success else failure - //System.out.println("Response Code:"+returnCode); - }catch(IOException ex){ - ex.printStackTrace(); - } catch(Exception ex){ - ex.printStackTrace(); - } - return returnCode; - } - - public int deleteCredential(String args[]){ - int returnCode=-1; - try{ - if(args!=null && args.length==4) - { - //display command which need to be executed or entered - displayCommand(args); - }else{ - return returnCode; - } - CredentialShell cs = new CredentialShell(); - Configuration conf = new Configuration(); - //parse argument - GenericOptionsParser parser = new GenericOptionsParser(conf, args); - //set the configuration back, so that Tool can configure itself - cs.setConf(conf); - //get valid and remaining argument - String[] toolArgs = parser.getRemainingArgs(); - //execute command in CredentialShell - returnCode= cs.run(toolArgs); - //if response code is zero then success else failure - //System.out.println("Response Code:"+returnCode); - }catch(IOException ex){ - ex.printStackTrace(); - } catch(Exception ex){ - ex.printStackTrace(); - } - return returnCode; - } - - public static boolean isValidCreateCommand(String command,String alias,String valueOption,String credential,String providerOption,String providerPath) - { - boolean isValid=true; - try{ - if(command==null || !"create".equalsIgnoreCase(command.trim())) - { - System.out.println("Invalid create phrase in credential creation command!!"); - System.out.println("Expected:'create' Found:'"+command+"'"); - displaySyntax("create"); - return false; - } - if(alias==null || "".equalsIgnoreCase(alias.trim())) - { - System.out.println("Invalid alias name phrase in credential creation command!!"); - System.out.println("Found:'"+alias+"'"); - displaySyntax("create"); - return false; - } - if(valueOption==null || !"-value".equalsIgnoreCase(valueOption.trim())) - { - System.out.println("Invalid value option switch in credential creation command!!"); - System.out.println("Expected:'-value' Found:'"+valueOption+"'"); - displaySyntax("create"); - return false; - } - if(valueOption==null || !"-value".equalsIgnoreCase(valueOption.trim())) - { - System.out.println("Invalid value option in credential creation command!!"); - System.out.println("Expected:'-value' Found:'"+valueOption+"'"); - displaySyntax("create"); - return false; - } - if(credential==null) - { - System.out.println("Invalid credential value in credential creation command!!"); - System.out.println("Found:"+credential); - displaySyntax("create"); - return false; - } - if(providerOption==null || !"-provider".equalsIgnoreCase(providerOption.trim())) - { - System.out.println("Invalid provider option in credential creation command!!"); - System.out.println("Expected:'-provider' Found:'"+providerOption+"'"); - displaySyntax("create"); - return false; - } - if(providerPath==null || "".equalsIgnoreCase(providerPath.trim()) || !providerPath.startsWith("jceks://")) - { - System.out.println("Invalid provider option in credential creation command!!"); - System.out.println("Found:'"+providerPath+"'"); - displaySyntax("create"); - return false; - } - }catch(Exception ex){ - System.out.println("Invalid input or runtime error! Please try again."); - System.out.println("Input:"+command+" "+alias+" "+valueOption+" "+credential+" "+providerOption+" "+providerPath); - displaySyntax("create"); - ex.printStackTrace(); - return false; - } - return isValid; - } - - public static void displayCommand(String args[]) - { - String debugOption = System.getProperty("debug") ; - if (debugOption != null && "TRUE".equalsIgnoreCase(debugOption)) { - StringBuffer tempBuffer=new StringBuffer(""); - if(args!=null && args.length>0){ - for(int index=0;index<args.length;index++){ - tempBuffer.append(args[index]+" "); - } - System.out.println("Command to execute:["+tempBuffer+"]"); - } - } - } - - public static void displaySyntax(String command){ - if(command!=null && command.trim().equalsIgnoreCase("create")){ - System.out.println("Correct syntax is:create <aliasname> -value <password> -provider <jceks://file/filepath>"); - System.out.println("sample command is:create myalias -value password123 -provider jceks://file/tmp/ks/myks.jceks"); - } - } - public String getCredential(String args[]){ - String command=null; - String alias=null; - String providerOption=null; - String providerPath=null; - String tempCredential=null; - try{ - if(args!=null && args.length==4){ - command=args[0]; - alias=args[1]; - providerOption=args[2]; - providerPath=args[3]; - if(!isValidGetCommand(command,alias,providerOption,providerPath)){ - displaySyntax("get"); - }else{ - tempCredential=CredentialReader.getDecryptedString(providerPath, alias); - } - }else{ - displaySyntax("get"); - } - if(tempCredential==null){ - System.out.println("Alias "+ alias +" does not exist!!"); - } - }catch(Exception ex){ - ex.printStackTrace(); - } - return tempCredential; - } - - public static boolean isValidGetCommand(String command,String alias,String providerOption,String providerPath){ - boolean isValid=true; - try{ - if(command==null || !"get".equalsIgnoreCase(command.trim())){ - System.out.println("Invalid get phrase in credential get command!!"); - System.out.println("Expected:'get' Found:'"+command+"'"); - displaySyntax("get"); - return false; - } - if(alias==null || "".equalsIgnoreCase(alias.trim())) - { - System.out.println("Invalid alias name phrase in credential get command!!"); - System.out.println("Found:'"+alias+"'"); - displaySyntax("get"); - return false; - } - if(providerOption==null || !"-provider".equalsIgnoreCase(providerOption.trim())) - { - System.out.println("Invalid provider option in credential get command!!"); - System.out.println("Expected:'-provider' Found:'"+providerOption+"'"); - displaySyntax("get"); - return false; - } - if(providerPath==null || "".equalsIgnoreCase(providerPath.trim()) || !providerPath.startsWith("jceks://")) - { - System.out.println("Invalid provider option in credential get command!!"); - System.out.println("Found:'"+providerPath+"'"); - displaySyntax("get"); - return false; - } - }catch(Exception ex){ - System.out.println("Invalid input or runtime error! Please try again."); - System.out.println("Input:"+command+" "+alias+" "+providerOption+" "+providerPath); - displaySyntax("get"); - ex.printStackTrace(); - return false; - } - return isValid; - } -} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java new file mode 100644 index 0000000..0b4a71a --- /dev/null +++ b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/CredentialReader.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ranger.credentialapi; +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.security.alias.CredentialProvider; +import org.apache.hadoop.security.alias.CredentialProviderFactory; +import org.apache.hadoop.security.alias.JavaKeyStoreProvider; + +public class CredentialReader { + + public static String getDecryptedString(String CrendentialProviderPath,String alias) { + String credential=null; + try{ + if(CrendentialProviderPath==null || alias==null){ + return null; + } + char[] pass = null; + Configuration conf = new Configuration(); + String crendentialProviderPrefix=JavaKeyStoreProvider.SCHEME_NAME + "://file"; + crendentialProviderPrefix=crendentialProviderPrefix.toLowerCase(); + CrendentialProviderPath=CrendentialProviderPath.trim(); + alias=alias.trim(); + if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefix)){ + conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, + //UserProvider.SCHEME_NAME + ":///," + + CrendentialProviderPath); + }else{ + if(CrendentialProviderPath.startsWith("/")){ + conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, + //UserProvider.SCHEME_NAME + ":///," + + JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath); + }else{ + conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, + //UserProvider.SCHEME_NAME + ":///," + + JavaKeyStoreProvider.SCHEME_NAME + "://file/" + CrendentialProviderPath); + } + } + List<CredentialProvider> providers = CredentialProviderFactory.getProviders(conf); + List<String> aliasesList=new ArrayList<String>(); + CredentialProvider.CredentialEntry credEntry=null; + for(CredentialProvider provider: providers) { + //System.out.println("Credential Provider :" + provider); + aliasesList=provider.getAliases(); + if(aliasesList!=null && aliasesList.contains(alias.toLowerCase())){ + credEntry=null; + credEntry= provider.getCredentialEntry(alias); + pass = credEntry.getCredential(); + if(pass!=null && pass.length>0){ + credential=String.valueOf(pass); + break; + } + } + } + }catch(Exception ex){ + ex.printStackTrace(); + credential=null; + } + return credential; + } + + /* + public static void main(String args[]) throws Exception{ + String keystoreFile =new String("/tmp/mykey3.jceks"); + String password=CredentialReader.getDecryptedString(keystoreFile, "mykey3"); + System.out.println(password); + }*/ +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java new file mode 100644 index 0000000..25be1d6 --- /dev/null +++ b/credentialbuilder/src/main/java/org/apache/ranger/credentialapi/buildks.java @@ -0,0 +1,433 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ranger.credentialapi; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.security.alias.CredentialShell; +import org.apache.hadoop.util.GenericOptionsParser; + +public class buildks { + public static void main(String[] args) { + buildks buildksOBJ=new buildks(); + String command=null; + try{ + if(args!=null && args.length>=3){ + command=args[0]; + if(command!=null && !command.trim().isEmpty()){ + if(command.equalsIgnoreCase("create")){ + buildksOBJ.createCredential(args); + }else if(command.equalsIgnoreCase("list")){ + buildksOBJ.listCredential(args); + }else if(command.equalsIgnoreCase("get")){ + String credential=buildksOBJ.getCredential(args); + if(credential!=null){ + System.out.println(credential); + System.exit(0); + }else{ + System.exit(1); + } + }else{ + System.out.println(command +" is not supported in current version of CredentialBuilder API."); + System.exit(1); + } + } + }else{ + System.out.println("Invalid Command line argument."); + System.exit(1); + } + }catch(Exception ex){ + ex.printStackTrace(); + System.exit(1); + } + } + + public int createCredential(String args[]){ + int returnCode=-1; + String command=null; + String alias=null; + String valueOption=null; + String credential=null; + String providerOption=null; + String providerPath=null; + String tempCredential=null; + try{ + if(args!=null && args.length==6) + { + command=args[0]; + alias=args[1]; + valueOption=args[2]; + credential=args[3]; + providerOption=args[4]; + providerPath=args[5]; + if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ + return returnCode; + } + tempCredential=CredentialReader.getDecryptedString(providerPath, alias); + }else{ + return returnCode; + } + + if(tempCredential==null){ + returnCode=createKeyStore(args); + }else{ + try{ + System.out.println("Alias already exist!! will try to delete first."); + String argsDelete[]=new String[4]; + argsDelete[0]="delete"; + argsDelete[1]=alias; + argsDelete[2]=providerOption; + argsDelete[3]=providerPath; + returnCode=deleteCredential(argsDelete); + if(returnCode==0){ + returnCode=createKeyStore(args); + } + }catch(Exception ex){ + returnCode=-1; + } + } + }catch(Exception ex){ + ex.printStackTrace(); + } + return returnCode; + } + + public int createKeyStore(String args[]){ + int returnCode=-1; + try{ + String command=null; + String alias=null; + String valueOption=null; + String credential=null; + String providerOption=null; + String providerPath=null; + if(args!=null && args.length==6) + { + command=args[0]; + alias=args[1]; + valueOption=args[2]; + credential=args[3]; + providerOption=args[4]; + providerPath=args[5]; + if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ + return returnCode; + } + displayCommand(args); + }else{ + return returnCode; + } + + CredentialShell cs = new CredentialShell(); + Configuration conf = new Configuration(); + //parse argument + GenericOptionsParser parser = new GenericOptionsParser(conf, args); + //set the configuration back, so that Tool can configure itself + cs.setConf(conf); + //get valid and remaining argument + String[] toolArgs = parser.getRemainingArgs(); + //execute command in CredentialShell + // int i = 0 ; + // for(String s : toolArgs) { + // System.out.println("TooArgs [" + i + "] = [" + s + "]") ; + // i++ ; + // } + returnCode= cs.run(toolArgs); + //if response code is zero then success else failure + //System.out.println("Response Code:"+returnCode); + }catch(IOException ex){ + ex.printStackTrace(); + } catch(Exception ex){ + ex.printStackTrace(); + } + return returnCode; + } + public int createCredentialFromUserInput(){ + int returnCode=-1; + try{ + String[] args=null; + String command=null; + String alias=null; + String valueOption=null; + String credential=null; + String providerOption=null; + String providerPath=null; + //below code can ask user to input if command line input fails + System.out.println("Enter Alias Name:"); + BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in)); + alias = bufferRead.readLine(); + System.out.println("Enter password:"); + credential = bufferRead.readLine(); + System.out.println("Enter .jceks output file name with path:"); + providerPath = bufferRead.readLine(); + if(providerPath!=null && !providerPath.trim().isEmpty() && !providerPath.startsWith("jceks://file")) + { + if(providerPath.startsWith("/")){ + providerPath="jceks://file"+providerPath; + }else{ + providerPath="jceks://file/"+providerPath; + } + } + command="create"; + valueOption="-value"; + providerOption="-provider"; + if(!isValidCreateCommand(command,alias,valueOption,credential,providerOption,providerPath)){ + return returnCode; + } + args=new String[6]; + args[0]=command; + args[1]=alias; + args[2]=valueOption; + args[3]=credential; + args[4]=providerOption; + args[5]=providerPath; + CredentialShell cs = new CredentialShell(); + Configuration conf = new Configuration(); + //parse argument + GenericOptionsParser parser = new GenericOptionsParser(conf, args); + //set the configuration back, so that Tool can configure itself + cs.setConf(conf); + //get valid and remaining argument + String[] toolArgs = parser.getRemainingArgs(); + //execute command in CredentialShell + returnCode= cs.run(toolArgs); + //if response code is zero then success else failure + //System.out.println("Response Code:"+returnCode); + }catch(IOException ex){ + ex.printStackTrace(); + } catch(Exception ex){ + ex.printStackTrace(); + } + return returnCode; + } + + public int listCredential(String args[]){ + int returnCode=-1; + try{ + if(args!=null && args.length==3) + { + //display command which need to be executed or entered + displayCommand(args); + }else{ + return returnCode; + } + CredentialShell cs = new CredentialShell(); + Configuration conf = new Configuration(); + //parse argument + GenericOptionsParser parser = new GenericOptionsParser(conf, args); + //set the configuration back, so that Tool can configure itself + cs.setConf(conf); + //get valid and remaining argument + String[] toolArgs = parser.getRemainingArgs(); + //execute command in CredentialShell + returnCode= cs.run(toolArgs); + //if response code is zero then success else failure + //System.out.println("Response Code:"+returnCode); + }catch(IOException ex){ + ex.printStackTrace(); + } catch(Exception ex){ + ex.printStackTrace(); + } + return returnCode; + } + + public int deleteCredential(String args[]){ + int returnCode=-1; + try{ + if(args!=null && args.length==4) + { + //display command which need to be executed or entered + displayCommand(args); + }else{ + return returnCode; + } + CredentialShell cs = new CredentialShell(); + Configuration conf = new Configuration(); + //parse argument + GenericOptionsParser parser = new GenericOptionsParser(conf, args); + //set the configuration back, so that Tool can configure itself + cs.setConf(conf); + //get valid and remaining argument + String[] toolArgs = parser.getRemainingArgs(); + //execute command in CredentialShell + returnCode= cs.run(toolArgs); + //if response code is zero then success else failure + //System.out.println("Response Code:"+returnCode); + }catch(IOException ex){ + ex.printStackTrace(); + } catch(Exception ex){ + ex.printStackTrace(); + } + return returnCode; + } + + public static boolean isValidCreateCommand(String command,String alias,String valueOption,String credential,String providerOption,String providerPath) + { + boolean isValid=true; + try{ + if(command==null || !"create".equalsIgnoreCase(command.trim())) + { + System.out.println("Invalid create phrase in credential creation command!!"); + System.out.println("Expected:'create' Found:'"+command+"'"); + displaySyntax("create"); + return false; + } + if(alias==null || "".equalsIgnoreCase(alias.trim())) + { + System.out.println("Invalid alias name phrase in credential creation command!!"); + System.out.println("Found:'"+alias+"'"); + displaySyntax("create"); + return false; + } + if(valueOption==null || !"-value".equalsIgnoreCase(valueOption.trim())) + { + System.out.println("Invalid value option switch in credential creation command!!"); + System.out.println("Expected:'-value' Found:'"+valueOption+"'"); + displaySyntax("create"); + return false; + } + if(valueOption==null || !"-value".equalsIgnoreCase(valueOption.trim())) + { + System.out.println("Invalid value option in credential creation command!!"); + System.out.println("Expected:'-value' Found:'"+valueOption+"'"); + displaySyntax("create"); + return false; + } + if(credential==null) + { + System.out.println("Invalid credential value in credential creation command!!"); + System.out.println("Found:"+credential); + displaySyntax("create"); + return false; + } + if(providerOption==null || !"-provider".equalsIgnoreCase(providerOption.trim())) + { + System.out.println("Invalid provider option in credential creation command!!"); + System.out.println("Expected:'-provider' Found:'"+providerOption+"'"); + displaySyntax("create"); + return false; + } + if(providerPath==null || "".equalsIgnoreCase(providerPath.trim()) || !providerPath.startsWith("jceks://")) + { + System.out.println("Invalid provider option in credential creation command!!"); + System.out.println("Found:'"+providerPath+"'"); + displaySyntax("create"); + return false; + } + }catch(Exception ex){ + System.out.println("Invalid input or runtime error! Please try again."); + System.out.println("Input:"+command+" "+alias+" "+valueOption+" "+credential+" "+providerOption+" "+providerPath); + displaySyntax("create"); + ex.printStackTrace(); + return false; + } + return isValid; + } + + public static void displayCommand(String args[]) + { + String debugOption = System.getProperty("debug") ; + if (debugOption != null && "TRUE".equalsIgnoreCase(debugOption)) { + StringBuffer tempBuffer=new StringBuffer(""); + if(args!=null && args.length>0){ + for(int index=0;index<args.length;index++){ + tempBuffer.append(args[index]+" "); + } + System.out.println("Command to execute:["+tempBuffer+"]"); + } + } + } + + public static void displaySyntax(String command){ + if(command!=null && command.trim().equalsIgnoreCase("create")){ + System.out.println("Correct syntax is:create <aliasname> -value <password> -provider <jceks://file/filepath>"); + System.out.println("sample command is:create myalias -value password123 -provider jceks://file/tmp/ks/myks.jceks"); + } + } + public String getCredential(String args[]){ + String command=null; + String alias=null; + String providerOption=null; + String providerPath=null; + String tempCredential=null; + try{ + if(args!=null && args.length==4){ + command=args[0]; + alias=args[1]; + providerOption=args[2]; + providerPath=args[3]; + if(!isValidGetCommand(command,alias,providerOption,providerPath)){ + displaySyntax("get"); + }else{ + tempCredential=CredentialReader.getDecryptedString(providerPath, alias); + } + }else{ + displaySyntax("get"); + } + if(tempCredential==null){ + System.out.println("Alias "+ alias +" does not exist!!"); + } + }catch(Exception ex){ + ex.printStackTrace(); + } + return tempCredential; + } + + public static boolean isValidGetCommand(String command,String alias,String providerOption,String providerPath){ + boolean isValid=true; + try{ + if(command==null || !"get".equalsIgnoreCase(command.trim())){ + System.out.println("Invalid get phrase in credential get command!!"); + System.out.println("Expected:'get' Found:'"+command+"'"); + displaySyntax("get"); + return false; + } + if(alias==null || "".equalsIgnoreCase(alias.trim())) + { + System.out.println("Invalid alias name phrase in credential get command!!"); + System.out.println("Found:'"+alias+"'"); + displaySyntax("get"); + return false; + } + if(providerOption==null || !"-provider".equalsIgnoreCase(providerOption.trim())) + { + System.out.println("Invalid provider option in credential get command!!"); + System.out.println("Expected:'-provider' Found:'"+providerOption+"'"); + displaySyntax("get"); + return false; + } + if(providerPath==null || "".equalsIgnoreCase(providerPath.trim()) || !providerPath.startsWith("jceks://")) + { + System.out.println("Invalid provider option in credential get command!!"); + System.out.println("Found:'"+providerPath+"'"); + displaySyntax("get"); + return false; + } + }catch(Exception ex){ + System.out.println("Invalid input or runtime error! Please try again."); + System.out.println("Input:"+command+" "+alias+" "+providerOption+" "+providerPath); + displaySyntax("get"); + ex.printStackTrace(); + return false; + } + return isValid; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/test/java/com/hortonworks/credentialapi/TestCredentialReader.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/test/java/com/hortonworks/credentialapi/TestCredentialReader.java b/credentialbuilder/src/test/java/com/hortonworks/credentialapi/TestCredentialReader.java deleted file mode 100644 index 8becce8..0000000 --- a/credentialbuilder/src/test/java/com/hortonworks/credentialapi/TestCredentialReader.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.hortonworks.credentialapi; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Before; -import org.junit.Test; - -public class TestCredentialReader { - private final String keystoreFile =System.getProperty("user.home")+"/testkeystore.jceks"; - @Before - public void setup() throws Exception { - buildks buildksOBJ=new buildks(); - String[] argsCreateCommand = {"create", "TestCredential2", "-value", "PassworD123", "-provider", "jceks://file" + keystoreFile}; - int rc2=buildksOBJ.createCredential(argsCreateCommand); - assertEquals( 0, rc2); - assertTrue(rc2==0); - } - - @Test - public void testPassword() throws Exception { - String password=CredentialReader.getDecryptedString(keystoreFile, "TestCredential2"); - assertEquals( "PassworD123", password); - assertTrue(password,"PassworD123".equals(password)); - //delete after use - String[] argsdeleteCommand = {"delete", "TestCredential2", "-provider", "jceks://file" + keystoreFile}; - buildks buildksOBJ=new buildks(); - buildksOBJ.deleteCredential(argsdeleteCommand); - - } - - - - -} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/test/java/com/hortonworks/credentialapi/Testbuildks.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/test/java/com/hortonworks/credentialapi/Testbuildks.java b/credentialbuilder/src/test/java/com/hortonworks/credentialapi/Testbuildks.java deleted file mode 100644 index e4acf89..0000000 --- a/credentialbuilder/src/test/java/com/hortonworks/credentialapi/Testbuildks.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.hortonworks.credentialapi; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -public class Testbuildks { - private final String keystoreFile =System.getProperty("user.home")+"/testkeystore.jceks"; - @Test - public void testBuildKSsuccess() throws Exception { - buildks buildksOBJ=new buildks(); - String[] argsCreateCommand = {"create", "TestCredential1", "-value", "PassworD123", "-provider", "jceks://file" + keystoreFile}; - int rc1=buildksOBJ.createCredential(argsCreateCommand); - assertEquals( 0, rc1); - assertTrue(rc1==0); - - String[] argsListCommand = {"list", "-provider","jceks://file" + keystoreFile}; - int rc2=buildksOBJ.listCredential(argsListCommand); - assertEquals(0, rc2); - assertTrue(rc2==0); - - String[] argsGetCommand = {"get", "TestCredential1", "-provider", "jceks://file" +keystoreFile }; - String pw=buildksOBJ.getCredential(argsGetCommand); - assertEquals("PassworD123", pw); - assertTrue(pw.equals("PassworD123")); - boolean getCredentialPassed = pw.equals("PassworD123"); - - String[] argsDeleteCommand = {"delete", "TestCredential1", "-provider", "jceks://file" +keystoreFile }; - int rc3=buildksOBJ.deleteCredential(argsDeleteCommand); - assertEquals(0, rc3); - assertTrue(rc3==0); - - if(rc1==rc2 && rc2==rc3 && rc3==0 && getCredentialPassed){ - System.out.println("Test Case has been completed successfully.."); - } - } - - @Test - public void testInvalidProvider() throws Exception { - buildks buildksOBJ=new buildks(); - String[] argsCreateCommand = {"create", "TestCredential1", "-value", "PassworD123", "-provider", "jksp://file"+keystoreFile}; - int rc1=buildksOBJ.createCredential(argsCreateCommand); - assertEquals(-1, rc1); - assertTrue(rc1==-1); - } - - @Test - public void testInvalidCommand() throws Exception { - buildks buildksOBJ=new buildks(); - String[] argsCreateCommand = {"creat", "TestCredential1", "-value", "PassworD123", "-provider", "jksp://file"+keystoreFile}; - int rc1=buildksOBJ.createCredential(argsCreateCommand); - assertEquals(-1, rc1); - assertTrue(rc1==-1); - } - /*public static void main(String args[]) throws Exception{ - Testbuildks tTestbuildks=new Testbuildks(); - tTestbuildks.testBuildKSsuccess(); - }*/ - -} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/413fcb68/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java ---------------------------------------------------------------------- diff --git a/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java new file mode 100644 index 0000000..f3e1ca8 --- /dev/null +++ b/credentialbuilder/src/test/java/org/apache/ranger/credentialapi/TestCredentialReader.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.ranger.credentialapi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.apache.ranger.credentialapi.CredentialReader; +import org.apache.ranger.credentialapi.buildks; +import org.junit.Before; +import org.junit.Test; + +public class TestCredentialReader { + private final String keystoreFile =System.getProperty("user.home")+"/testkeystore.jceks"; + @Before + public void setup() throws Exception { + buildks buildksOBJ=new buildks(); + String[] argsCreateCommand = {"create", "TestCredential2", "-value", "PassworD123", "-provider", "jceks://file" + keystoreFile}; + int rc2=buildksOBJ.createCredential(argsCreateCommand); + assertEquals( 0, rc2); + assertTrue(rc2==0); + } + + @Test + public void testPassword() throws Exception { + String password=CredentialReader.getDecryptedString(keystoreFile, "TestCredential2"); + assertEquals( "PassworD123", password); + assertTrue(password,"PassworD123".equals(password)); + //delete after use + String[] argsdeleteCommand = {"delete", "TestCredential2", "-provider", "jceks://file" + keystoreFile}; + buildks buildksOBJ=new buildks(); + buildksOBJ.deleteCredential(argsdeleteCommand); + + } + + + + +}
