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 com.att.eelf.configuration.EELFLogger;
32 import com.att.eelf.configuration.EELFManager;
33 import java.io.FileInputStream;
34 import java.io.IOException;
35 import java.net.InetAddress;
36 import java.security.KeyStore;
37 import java.security.MessageDigest;
38 import java.security.cert.X509Certificate;
39 import java.text.SimpleDateFormat;
40 import java.util.Date;
41 import java.util.Enumeration;
42 import java.util.TimeZone;
43 import org.apache.commons.codec.binary.Base64;
44 import org.apache.log4j.Logger;
45 import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
48 import javax.servlet.http.HttpServletResponse;
51 * Utility functions for the data router node
53 public class NodeUtils {
55 private static EELFLogger eelfLogger = EELFManager.getInstance()
56 .getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
57 private static Logger nodeUtilsLogger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
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 exception) {
100 .error("Exception in generating Credentials for given node name:= " + exception.toString(), exception);
106 * Given a keystore file and its password, return the value of the CN of the first private key entry with a
109 * @param kstype The type of keystore
110 * @param ksfile The file name of the keystore
111 * @param kspass The password of the keystore
112 * @return CN of the certificate subject or null
114 public static String getCanonicalName(String kstype, String ksfile, String kspass) {
117 ks = KeyStore.getInstance(kstype);
118 try (FileInputStream fileInputStream = new FileInputStream(ksfile)) {
119 ks.load(fileInputStream, kspass.toCharArray());
120 } catch (IOException ioException) {
121 nodeUtilsLogger.error("IOException occurred while opening FileInputStream: " + ioException.getMessage(),
125 } catch (Exception e) {
126 setIpAndFqdnForEelf("getCanonicalName");
127 eelfLogger.error(EelfMsgs.MESSAGE_KEYSTORE_LOAD_ERROR, ksfile, e.toString());
128 nodeUtilsLogger.error("NODE0401 Error loading my keystore file + " + ksfile + " " + e.toString(), e);
131 return (getCanonicalName(ks));
135 * Given a keystore, return the value of the CN of the first private key entry with a certificate.
137 * @param ks The KeyStore
138 * @return CN of the certificate subject or null
140 public static String getCanonicalName(KeyStore ks) {
142 Enumeration<String> aliases = ks.aliases();
143 while (aliases.hasMoreElements()) {
144 String s = aliases.nextElement();
145 if (ks.entryInstanceOf(s, KeyStore.PrivateKeyEntry.class)) {
146 X509Certificate c = (X509Certificate) ks.getCertificate(s);
148 String subject = c.getSubjectX500Principal().getName();
149 String[] parts = subject.split(",");
150 if (parts.length < 1) {
153 subject = parts[5].trim();
154 if (!subject.startsWith("CN=")) {
158 return (subject.substring(3));
162 } catch (Exception e) {
163 nodeUtilsLogger.error("NODE0402 Error extracting my name from my keystore file " + e.toString(), e);
169 * Given a string representation of an IP address, get the corresponding byte array
171 * @param ip The IP address as a string
172 * @return The IP address as a byte array or null if the address is invalid
174 public static byte[] getInetAddress(String ip) {
176 return (InetAddress.getByName(ip).getAddress());
177 } catch (Exception exception) {
179 .error("Exception in generating byte array for given IP address := " + exception.toString(), exception);
185 * Given a uri with parameters, split out the feed ID and file ID
187 public static String[] getFeedAndFileID(String uriandparams) {
188 int end = uriandparams.length();
189 int i = uriandparams.indexOf('#');
190 if (i != -1 && i < end) {
193 i = uriandparams.indexOf('?');
194 if (i != -1 && i < end) {
197 end = uriandparams.lastIndexOf('/', end);
201 i = uriandparams.lastIndexOf('/', end - 1);
205 return (new String[]{uriandparams.substring(i + 1, end), uriandparams.substring(end + 1)});
209 * Escape fields that might contain vertical bar, backslash, or newline by replacing them with backslash p,
210 * backslash e and backslash n.
212 public static String loge(String s) {
216 return (s.replaceAll("\\\\", "\\\\e").replaceAll("\\|", "\\\\p").replaceAll("\n", "\\\\n"));
220 * Undo what loge does.
222 public static String unloge(String s) {
226 return (s.replaceAll("\\\\p", "\\|").replaceAll("\\\\n", "\n").replaceAll("\\\\e", "\\\\"));
230 * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
232 public static String logts(long when) {
233 return (logts(new Date(when)));
237 * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
239 public static synchronized String logts(Date when) {
240 SimpleDateFormat logDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
241 logDate.setTimeZone(TimeZone.getTimeZone("GMT"));
242 return (logDate.format(when));
245 /* Method prints method name, server FQDN and IP Address of the machine in EELF logs
246 * @Method - setIpAndFqdnForEelf - Rally:US664892
247 * @Params - method, prints method name in EELF log.
249 public static void setIpAndFqdnForEelf(String method) {
251 MDC.put(MDC_SERVICE_NAME, method);
253 MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
254 MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
255 } catch (Exception exception) {
257 .error("Exception in generating byte array for given IP address := " + exception.toString(), exception);
262 public static void sendResponseError(HttpServletResponse response, int errorCode, Logger intlogger) {
264 response.sendError(errorCode);
265 } catch (IOException ioe) {
266 intlogger.error("IOException" + ioe.getMessage());