1 /*******************************************************************************
2 * ============LICENSE_START==================================================
4 * * ===========================================================================
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * * ===========================================================================
7 * * Licensed under the Apache License, Version 2.0 (the "License");
8 * * you may not use this file except in compliance with the License.
9 * * You may obtain a copy of the License at
11 * * http://www.apache.org/licenses/LICENSE-2.0
13 * * Unless required by applicable law or agreed to in writing, software
14 * * distributed under the License is distributed on an "AS IS" BASIS,
15 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * * See the License for the specific language governing permissions and
17 * * limitations under the License.
18 * * ============LICENSE_END====================================================
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 ******************************************************************************/
25 package org.onap.dmaap.datarouter.node;
27 import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
28 import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
29 import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
31 import java.security.*;
34 import java.security.cert.*;
38 import org.apache.commons.codec.binary.Base64;
39 import org.apache.log4j.Logger;
40 import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
43 import com.att.eelf.configuration.EELFLogger;
44 import com.att.eelf.configuration.EELFManager;
47 * Utility functions for the data router node
49 public class NodeUtils {
50 private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
51 private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
52 private static SimpleDateFormat logdate;
55 logdate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
56 logdate.setTimeZone(TimeZone.getTimeZone("GMT"));
63 * Base64 encode a byte array
65 * @param raw The bytes to be encoded
66 * @return The encoded string
68 public static String base64Encode(byte[] raw) {
69 return (Base64.encodeBase64String(raw));
73 * Given a user and password, generate the credentials
75 * @param user User name
76 * @param password User password
77 * @return Authorization header value
79 public static String getAuthHdr(String user, String password) {
80 if (user == null || password == null) {
83 return ("Basic " + base64Encode((user + ":" + password).getBytes()));
87 * Given a node name, generate the credentials
89 * @param node Node name
91 public static String getNodeAuthHdr(String node, String key) {
93 MessageDigest md = MessageDigest.getInstance("SHA");
94 md.update(key.getBytes());
95 md.update(node.getBytes());
96 md.update(key.getBytes());
97 return (getAuthHdr(node, base64Encode(md.digest())));
98 } catch (Exception e) {
104 * Given a keystore file and its password, return the value of the CN of the first private key entry with a certificate.
106 * @param kstype The type of keystore
107 * @param ksfile The file name of the keystore
108 * @param kspass The password of the keystore
109 * @return CN of the certificate subject or null
111 public static String getCanonicalName(String kstype, String ksfile, String kspass) {
113 KeyStore ks = KeyStore.getInstance(kstype);
114 ks.load(new FileInputStream(ksfile), kspass.toCharArray());
115 return (getCanonicalName(ks));
116 } catch (Exception e) {
117 setIpAndFqdnForEelf("getCanonicalName");
118 eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_LOAD_ERROR, ksfile, e.toString());
119 logger.error("NODE0401 Error loading my keystore file + " + ksfile + " " + e.toString(), e);
125 * Given a keystore, return the value of the CN of the first private key entry with a certificate.
127 * @param ks The KeyStore
128 * @return CN of the certificate subject or null
130 public static String getCanonicalName(KeyStore ks) {
132 Enumeration<String> aliases = ks.aliases();
133 while (aliases.hasMoreElements()) {
134 String s = aliases.nextElement();
135 if (ks.entryInstanceOf(s, KeyStore.PrivateKeyEntry.class)) {
136 X509Certificate c = (X509Certificate) ks.getCertificate(s);
138 String subject = c.getSubjectX500Principal().getName();
139 String[] parts = subject.split(",");
140 if (parts.length < 1) {
143 subject = parts[0].trim();
144 if (!subject.startsWith("CN=")) {
148 return (subject.substring(3));
152 } catch (Exception e) {
153 logger.error("NODE0402 Error extracting my name from my keystore file " + e.toString(), e);
159 * Given a string representation of an IP address, get the corresponding byte array
161 * @param ip The IP address as a string
162 * @return The IP address as a byte array or null if the address is invalid
164 public static byte[] getInetAddress(String ip) {
166 return (InetAddress.getByName(ip).getAddress());
167 } catch (Exception e) {
173 * Given a uri with parameters, split out the feed ID and file ID
175 public static String[] getFeedAndFileID(String uriandparams) {
176 int end = uriandparams.length();
177 int i = uriandparams.indexOf('#');
178 if (i != -1 && i < end) {
181 i = uriandparams.indexOf('?');
182 if (i != -1 && i < end) {
185 end = uriandparams.lastIndexOf('/', end);
189 i = uriandparams.lastIndexOf('/', end - 1);
193 return (new String[]{uriandparams.substring(i + 1, end - 1), uriandparams.substring(end + 1)});
197 * Escape fields that might contain vertical bar, backslash, or newline by replacing them with backslash p, backslash e and backslash n.
199 public static String loge(String s) {
203 return (s.replaceAll("\\\\", "\\\\e").replaceAll("\\|", "\\\\p").replaceAll("\n", "\\\\n"));
207 * Undo what loge does.
209 public static String unloge(String s) {
213 return (s.replaceAll("\\\\p", "\\|").replaceAll("\\\\n", "\n").replaceAll("\\\\e", "\\\\"));
217 * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
219 public static String logts(long when) {
220 return (logts(new Date(when)));
224 * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
226 public static synchronized String logts(Date when) {
227 return (logdate.format(when));
230 /* Method prints method name, server FQDN and IP Address of the machine in EELF logs
231 * @Method - setIpAndFqdnForEelf - Rally:US664892
232 * @Params - method, prints method name in EELF log.
234 public static void setIpAndFqdnForEelf(String method) {
236 MDC.put(MDC_SERVICE_NAME, method);
238 MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
239 MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
240 } catch (Exception e) {